哪种方法可以处理创建对象以保留属性的最佳方法?我已经列举了几个例子。
假设该属性为:
@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];
答案 0 :(得分:5)
如果在初始化保存变量的对象:
1)没有。在部分构建的状态中调用访问器是不好的形式(例如init
,dealloc
)
2)没有。在部分构建的状态中调用访问器是不好的形式(例如init
,dealloc
)
3)正确。
例外:如果您的ivars 不是私有且您正在执行声明该属性的类型的子类,那么您还必须检查是否父类初始化了该属性。最好将属性设为私有或以其他方式不能直接访问子类。
4)没有。在部分构建的状态中调用访问器是不好的形式(例如init
,dealloc
)
当您使用完全构建的实例时:
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。