使用点语法设置retain属性时使用自动释放?

Zhe*_*hen 6 cocoa-touch memory-management objective-c autorelease ios

我在一些使用的示例代码中看到autorelease.在需要时我不熟悉这些实例.例如,如果我创建一个注释对象

头文件

@interface someViewController: UIViewController 
{
    Annotation *annotation;
}

@property (nonatomic, retain) Annotation *annotation;

@end
Run Code Online (Sandbox Code Playgroud)

实施文件

@implementation someViewController
@synthesize annotation
@end
Run Code Online (Sandbox Code Playgroud)

问题:如果我在实现文件中初始化我的注释对象,这是正确的方法吗?

self.annotation = [[Annotation alloc] initWithCoordinate:location];
Run Code Online (Sandbox Code Playgroud)

我需要为此设置自动释放吗?或者我可以按正常方式执行此操作并在dealloc方法中添加发布吗?

ser*_*gio 15

这是对的:

self.annotation = [[[Annotation alloc] initWithCoordinate:location] autorelease];

因为annotation属性被声明为retain属性,所以赋值将增加其保留计数.

你也需要同样发布self.annotation -dealloc.

简而言之:

  1. init会将retain count设置为1;

  2. 分配给self.annotation,将其设置为2;

  3. 当主循环再次执行时,autorelease将其设置回1;

  4. 在dealloc中释放会将retain count设置为0,这样对象就会被释放);

autorelease在我看来,最好的思考方式是:在将来的某些(接近)点为你的对象autorelease"安排"一个"自动" release(通常当控制流回到主循环时,但隐藏细节)在Apple手中).

autoreleaseinit特别是在以下情况下,它主要是有用的:

  1. 当你init是一个局部变量时,所以release在它超出范围之前你不必明确它(主循环会为你做这个);

  2. 当你返回一个指向你刚创建的对象的指针而不保留它的所有权时(create/make*这种选择器的典型情况,接收器需要retain它来获得所有权);

  3. 具有属性retain,当您为它们分配一个它们应该唯一拥有的对象时;

  4. 使用增加保留计数(NSMutableArray,NSMutableDictionary等)的数据结构:当您将其添加到此类数据结构时,通常应该autorelease是新init编辑的对象.

除了案例2之外,很明显使用它是autorelease为了提高代码的可读性并减少错误的可能性(这意味着在所有其他情况下,您可以release在分配后或在结束时简单地明确您的对象范围).

使用属性时,你必须总是要检查他们是否是中retainassign/ copy情形; 在第一种情况下,init通常需要将新编辑的对象分配给属性autorelease.

无论如何,我建议至少浏览一下关于iOS内存管理的许多教程.