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

Err*_*rol 5 cocoa objective-c ios

处理创建对象以保留属性的最佳方法是哪种?我已经包含了几个例子.

假设该属性是:

@property (nonatomic, retain) myProperty;
@synthesize myProperty = _myProperty;
Run Code Online (Sandbox Code Playgroud)

选项1:

self.myProperty = [[[MyClass alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

选项2:

self.myProperty = [[MyClass alloc] init];
[self.myProperty release];
Run Code Online (Sandbox Code Playgroud)

选项3:

_myProperty = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

选项4:

MyClass *property = [[MyClass alloc] init];
self.myProperty = property;
[property release];
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 5

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

1)没有.它的坏的形式通过在部分构造的状态存取调用(例如init,dealloc)

2)没有.它的坏的形式通过在部分构造的状态存取调用(例如init,dealloc)

3)正确.

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

4)没有.它的坏的形式通过在部分构造的状态存取调用(例如init,dealloc)

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

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

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

3)不好.如果_myProperty不是,可能会引入泄漏nil.

4)最好的


Ste*_*eve 4

选项 1:可以接受...但是自动释放会浪费资源。该引用被添加到需要在运行循环结束时释放的项目列表中...即使不需要,您的变量也会一直保留到那时...等等,等等。我相信使用了此选项经常……但我也认为这是懒惰和浪费的。

选项2:令人困惑。它本身并没有什么问题,但我想说这是一种糟糕的形式。

选项 3:可以接受,但并不理想。如果有自定义设置器怎么办?等等。我个人只会在自定义设置器本身中使用这种形式,或者可能在类初始值设定项中使用这种形式。否则,您就会错过房产的一些好处。

选项 4:最好。