構文が実際には Obj-C に準拠していないという事実に加えて、そのような場合にメモリを管理するためのいくつかのオプションがあります。
注:パラメータを変数に保存したくないと仮定しています。そうでない場合は、コンストラクタに渡した後にそのような変数を解放するだけです。ARC では、リリースする必要がないため、これは大きな違いではありません。
ARCなし。ファクトリ メソッド
Objective-C のファクトリ メソッドは、慣例により自動解放されます。この規則は非常に強力であるため、ARC でさえそのようなメソッドが自動解放されることを期待するため、注意してください。
Matrix *mat = [Matrix matrixWithVectors:[Vector vectorWithCoordinatesX:1 y:1 z:1],
[Vector vectorWithCoordinatesX:1 y:1 z:1],
[Vector vectorWithCoordinatesX:1 y:1 z:1], nil];
の実装はvectorWithCoordinates
、例として、次のようになります。
+ (Vector *)vectorWithCoordinatesX:(CGFloat)x y:(CGFloat)y z:(CGFloat)z {
return [[[Vector alloc] initWithCoordinatesX:x y:y z:z] autorelease];
}
ARCなし。自動解放
パラメータをインラインで作成しているため、パラメータへの参照を保持していない場合は、明示的に自動解放することもできます。
Matrix *mat = [[[Matrix alloc] initWithVectors:[[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
[[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
[[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease], nil] autorelease];
アーク
ARC では、コンパイラが処理するため、リリースする必要はありません。
だから両方
Matrix *mat = [Matrix matrixWithVectors:[Vector vectorWithCoordinatesX:1 y:1 z:1],
[Vector vectorWithCoordinatesX:1 y:1 z:1],
[Vector vectorWithCoordinatesX:1 y:1 z:1], nil];
と
Matrix *mat = [[Matrix alloc] initWithVectors:[[Vector alloc] initWithCoordinatesX:1 y:1 z:1],
[[Vector alloc] initWithCoordinatesX:1 y:1 z:1],
[[Vector alloc] initWithCoordinatesX:1 y:1 z:1], nil];
は正しい。
ここでの私の仮定は、Matrix
コンストラクターが引数として任意の数のベクトルを取り、nil
終了することでもあります。