除了您的语法不是真正符合 Obj-C 的事实之外,在这种情况下还有多种管理内存的选项。
注意:我假设您不想将参数存储到变量中,否则只需在将这些变量传递给构造函数后释放它们即可。使用 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];
}
没有弧。自动释放
如果因为内联创建参数而没有保留对参数的引用,则还可以显式地自动释放它们。
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
终止。