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.
简而言之:
init会将retain count设置为1;
分配给self.annotation,将其设置为2;
当主循环再次执行时,autorelease将其设置回1;
在dealloc中释放会将retain count设置为0,这样对象就会被释放);
autorelease在我看来,最好的思考方式是:在将来的某些(接近)点为你的对象autorelease"安排"一个"自动" release(通常当控制流回到主循环时,但隐藏细节)在Apple手中).
autoreleaseinit特别是在以下情况下,它主要是有用的:
当你init是一个局部变量时,所以release在它超出范围之前你不必明确它(主循环会为你做这个);
当你返回一个指向你刚创建的对象的指针而不保留它的所有权时(create/make*这种选择器的典型情况,接收器需要retain它来获得所有权);
具有属性retain,当您为它们分配一个它们应该唯一拥有的对象时;
使用增加保留计数(NSMutableArray,NSMutableDictionary等)的数据结构:当您将其添加到此类数据结构时,通常应该autorelease是新init编辑的对象.
除了案例2之外,很明显使用它是autorelease为了提高代码的可读性并减少错误的可能性(这意味着在所有其他情况下,您可以release在分配后或在结束时简单地明确您的对象范围).
使用属性时,你必须总是要检查他们是否是中retain或assign/ copy情形; 在第一种情况下,init通常需要将新编辑的对象分配给属性autorelease.
无论如何,我建议至少浏览一下关于iOS内存管理的许多教程.
| 归档时间: |
|
| 查看次数: |
4441 次 |
| 最近记录: |