2009-09-01 4 views
2

私は同じクラスの4つのバリエーションがあります。NSString(ポインタ/非ポインタ)代入または保持

ポインター、ポインタ以外のものを混在させるとvs copyが割り当てられます。

それぞれのケースを使用することの意義は何ですか?

1)

 
@interface fruit:NSObject{ 
NSString apple; 
} 
@property(nonatomic, retain); 
@end 

2)

 
@interface fruit:NSObject{ 
NSString apple; 
} 
@property(nonatomic, assign); 
@end 

3)

 
@interface fruit:NSObject{ 
NSString *apple; 
} 
@property(nonatomic, retain); 
@end 

4)あなたがすべき私の知る限り

 
@interface fruit:NSObject{ 
NSString *apple; 
} 
@property(nonatomic, assign); 
@end 
+0

考慮する別のオプションは、文字列を保持または割り当てる代わりに(明らかに)文字列をコピーする(非原子的なコピー)です。 –

答えて

2

常にNSString *で保持またはコピーのいずれかを使用します。ポインタ(4)の割り当ては参照カウントをインクリメントしないので、メモリがリークするか、またはカウントが早すぎると解放されたメモリにアクセスすることになります。

使用できるかどうかわかりませんネイティブタイプのNSString。私はいつもそれをポインタとして使います。

+0

NSStringはオブジェクトですが、それが適切ではないとしても、割り当てを使用することが可能かどうかは不思議です。ええ、メモリリークについては意味があります。 – qstar

+0

私たちは非ポインタNSStringを扱うことができますか? – qstar

+0

Objective-Cにポインタ以外のオブジェクト変数はありません。プログラムをコンパイルしようとすると、そのことを知ることができます。 – Chuck

9

1)

@interface fruit:NSObject{ 
NSString apple; 
} 
@property(nonatomic, retain); 
@end 

あなたは、スタック上またはオブジェクトインスタンス変数としてNSObjectsを割り当てることができません。初期の段階でObjective-Cはこれを許可しましたが、もはやそれはありません。このコードは間違っています。

2)

@interface fruit:NSObject{ 
NSString apple; 
} 
@property(nonatomic, assign); 
@end 

あなたは、スタック上またはオブジェクトインスタンス変数としてNSObjectsを割り当てることができません。初期の段階でObjective-Cはこれを許可しましたが、もはやそれはありません。このコードは間違っています。

3)

@interface fruit:NSObject{ 
NSString *apple; 
} 
@property(nonatomic, retain); 
@end 

あなたがその所有権を保持しながら、それが割り当て解除されないことを保証し、NSStringインスタンス内の所有株式を保持しています。 NSMutableStringNSStringのサブクラスなので、代入時に変更可能な文字列が与えられている可能性があります。他のコードでは、変更を観察するためにKey-Value Observingを使用している場合を除き、このような理由から、それは通常あなたが不変の値を保持しようとする性質のためcopyセマンティクスを使用するのが適切(NSStringNSDataNSArrayNSSetは共通している - exaustiveていないが - 容疑者を)です。

4)

@interface fruit:NSObject{ 
NSString *apple; 
} 
@property(nonatomic, assign); 
@end 

あなたはないは、文字列の所有持分を保持それはあなたの知識でなくて割り当てを解除することができることを意味しています。参照カウント環境では、デリゲートプロパティを保持すると保持サイクルが作成される可能性があるため、デリゲートプロパティの標準的な方法です。文字列の割り当てを解除するコードでは、ref-counted環境で、appleのプロパティをnilに設定する必要があります。GC環境では、宣言に__weakポインタがある場合は、__strongポインタがある場合は文字列が生きていて、deallocの場合は0に設定されます。

+0

ありがとうございました。 "NSObjectをスタックに割り当てることはできません"という意味はどうですか? スタックはメモリ内の特別な場所を意味しますか? 私は非ポインタを渡しているので – qstar

関連する問題