1

古い OS X プログラムを書き直していますが、その過程で初めて ARC を使用しています。これらのプロパティ定義を含むクラスがあります。

@property NSMutableArray *variables; //variable names
@property NSData *ebndArray; //boundary energies

これらは次のように合成されます (インスタンス変数は宣言しません)。

@synthesize variables = _variables;
@synthesize ebndArray = _ebndArray;

initメソッドには次の行が含まれます。

self.variables = [[NSMutableArray alloc] initWithCapacity:self.npparxx];
self.ebndArray = [NSData dataWithBytesNoCopy:theArray length:arrayLength];

プロパティへの割り当てについてvariables、Xcode は警告Assigning reserved object to unsafe property を表示しています。ebndArrayプロパティの警告はありません。プロパティ定義に追加(strong)することで、警告 (および結果として生じる問題) を排除できることはわかっています。定義variablesに追加する必要がないのはなぜですか? ebndArrayを追加しなくても、ebndArrayプロパティは正しく機能し(strong)ますか?

OS X 10.7.3 で Xcode 4.3.2 を実行しています。

4

1 に答える 1

2

セッターセマンティクスを指定しない場合の@propertyのデフォルトはです(assign)。これは、合成されたセッターが単純な割り当てを使用することを意味します。つまり、initメソッドの2行は、実際には次のようになります。

_variables = [[NSMutableArray alloc] initWithCapacity:self.npparxx];
_ebndArray = [NSData dataWithBytesNoCopy:theArray length:arrayLength];

メソッドの最後にARCを使用するinitと、コンパイラは自動的にに相当するものを挿入し[_variables release]ます。したがって、すぐに割り当てが解除されます。の状況ebndArrayは異なりますが、それ以上のことはありません。保持カウントが0のivarに割り当てたばかりなので、次に自動的に解放され、囲んでいる自動解放プールによって実行ループを介して割り当てが解除されます。

の所有関係が必要な場合は、のセッターセマンティクスを指定して、プロパティ宣言でそのように言いvariablesます。さらに読むためにARCがどのように機能するかについての良い説明は、ARCに関するMikeAshのブログ投稿です。ebndArray(strong)

于 2012-06-14T23:58:12.857 に答える