将保留属性设置为新创建的对象的最佳方法

时间:2011-10-20 21:43:20

标签: objective-c ios cocoa

哪种方法可以处理创建对象以保留属性的最佳方法?我已经列举了几个例子。

假设该属性为:

@property (nonatomic, retain) myProperty;
@synthesize myProperty = _myProperty;

选项1:

self.myProperty = [[[MyClass alloc] init] autorelease];

选项2:

self.myProperty = [[MyClass alloc] init];
[self.myProperty release];

选项3:

_myProperty = [[MyClass alloc] init];

选项4:

MyClass *property = [[MyClass alloc] init];
self.myProperty = property;
[property release];

4 个答案:

答案 0 :(得分:5)

如果在初始化保存变量的对象:

1)没有。在部分构建的状态中调用访问器是不好的形式(例如initdealloc

2)没有。在部分构建的状态中调用访问器是不好的形式(例如initdealloc

3)正确。

例外:如果您的ivars 不是私有且您正在执行声明该属性的类型的子类,那么您还必须检查是否父类初始化了该属性。最好将属性设为私有或以其他方式不能直接访问子类。

4)没有。在部分构建的状态中调用访问器是不好的形式(例如initdealloc

当您使用完全构建的实例时:

1)当readbaility比保持堆大小更重要时,这很好。

2)不好。从getter返回的对象不一定是您指定的对象。

3)糟糕。如果_myProperty不是nil,则可能会引入泄漏。

4)最好的

答案 1 :(得分:4)

选项1:可接受......但是你在使用autorelease浪费资源。引用被添加到需要在运行循环结束时释放的项目列表...您的变量保持不变,直到那时即使它不需要...等等。我相信使用此选项经常...但我也相信这是懒惰和浪费。

选项2:令人困惑。这本身没有任何问题,但我认为这是糟糕的形式。

选项3:可接受,但不理想。如果有自定义设置器怎么办?等等。我个人只在自定义设置器本身中使用此表单,或者可能在类初始化器中使用。否则,你会错过房产的一些好处。

选项4:最佳。

答案 2 :(得分:4)

self.myProperty = [[MyClass alloc] init];

使用ARC生成您的版本并在编译时保留。

答案 3 :(得分:2)

选项1是正确的。

选项2绝对错误。您从不在属性访问者的结果上调用-release

选项3完全避免了属性。这在-init方法中实际上是正确的,但在其他方法中,最好使用属性设置器,除非您有充分的理由避免它。

选项4也是正确的,但它比选项1更详细。你的电话。

修改:我最初误读了您的选项4。