8

iOS ARC 対応プロジェクトで、保持/解放が許可されていないため、プロパティを合成しないとどうなりますか?

@interface SomeClass : NSObject {
    NSMutableArray*     _pieces;
}
@end

この場合、iVar _pieces のメモリ セマンティクスは何ですか? を使用して設定したとし_pieces = whateverます。

SomeClass のインスタンスの割り当てが解除されると、_pieces は nil に設定されますか? _pieces は弱い参照として保存されますか? _pieces を保持している他のすべてのオブジェクトがそれを解放した場合、アクセスしようとすると null になりますか?

4

5 に答える 5

3

this を使用するプロパティを作成していないと仮定すると、これは想定される動作をオーバーライドします。ARC プロジェクトのインスタンス変数は強いと想定されるため、宣言は実際には

@interface SomeClass : NSObject {
    __strong NSMutableArray* _pieces;
}
@end

では、ご質問への回答として

SomeClass のインスタンスの割り当てが解除されると、_pieces は nil に設定されますか?

いいえ。ただし、インスタンスを割り当てても、割り当てが解除されることはありません。

_pieces は弱い参照として保存されますか?

いいえ、それは強力な参照です。

_pieces を保持している他のすべてのオブジェクトがそれを解放した場合、アクセスしようとすると null になりますか?

いいえ、これは最初の質問と同じです。

于 2012-11-08T21:13:20.483 に答える
2

名前付きのプロパティを宣言していますpiecesか、それともストレート ivar ですか?

プロパティを定義する場合、メモリ使用量はプロパティの定義方法によって異なります。

これがストレート ivar の場合、デフォルトで ivar は になりますstrong。これは基本的に、割り当てたオブジェクトが何であれ ivar が適切に保持および解放することを意味します。気にせず安心してご利用いただけます。

于 2012-11-08T21:13:00.827 に答える
0

新しいランタイムでは @properties だけが必要です - ivar を宣言しないでください、合成しないでください

于 2012-11-08T21:31:12.197 に答える
0

私の知る限りでは、ARC は、ユーザーがstrong. それに代入すると、入ってくる値はretained になり、指されなくなった値はreleased になります。どういうわけかオーバーリリースされた場合にのみぶら下がります。プロパティ宣言がある場合、ARC はそこで指定された規則に従い、アクセサーはフォームで自動的に合成されます@synthesize someObject = _someObject。オブジェクトの割り当てが解除されると、オブジェクトが送信releaseされ、他に所有権が主張されていない場合は、ポインターが指すオブジェクトも割り当てが解除されると思います。

于 2012-11-08T21:17:58.327 に答える