将保留属性设置为新创build的对象的最佳方法
处理创build对象以保留属性是最好的方法? 我已经包含了几个例子。
假设房产是:
@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];
选项1:可接受…但是你正在浪费资源与autorelease。 该引用被添加到需要在运行循环结束时释放的项目列表中……您的variables一直保持到那时,即使它不需要.. etc等等,我相信这个选项被使用经常…但我也相信这是懒惰和浪费。
选项2:混淆。 它本身没有错,但我会说这是不好的forms。
备选scheme3:可接受但不理想。 如果有一个自定义的setter? 等我个人只使用自定义设置本身,或者,可能在类初始化。 否则,你错过了属性的一些好处。
选项4:最好。
如果在保存variables的对象的初始化中:
1)没有。 在部分构造的状态下调用访问器是不好的forms(例如init
, dealloc
)
2)没有。 在部分构造的状态下调用访问器是不好的forms(例如init
, dealloc
)
3)正确。
例外:如果你的ivars 不是私有的,而且你正在执行声明该属性的types的子类,那么你还必须检查父类是否初始化该属性。 最好使这些属性是私有的,否则不能直接访问子类。
4)没有。 在部分构造的状态下调用访问器是不好的forms(例如init
, dealloc
)
当您使用完全构造的实例时:
1)当readbaility比保持堆大小低时更重要。
2)不好。 从getter返回的对象不一定是您分配的对象。
3)不好。 如果_myProperty
不是nil
可能会引入泄漏。
4)最好
self.myProperty = [[MyClass alloc] init];
使用ARC在编译时生成你的版本并保留。
选项1是正确的。
选项2是绝对错误的。 你永远不会调用 – -release
属性访问器的结果。
选项3完全避免了属性。 这在你的-init
方法中是正确的,但在其他方法中,最好使用属性setter,除非你有一个很好的理由避免它。
选项4也是正确的,虽然它比选项1更详细。
编辑 :我最初误解了你的select4。