头文件
@interface someViewController: UIViewController { Annotation *annotation; } @property (nonatomic,retain) Annotation *annotation; @end
实施文件
@implementation someViewController @synthesize annotation @end
问题:如果我在实现文件中初始化我的注释对象,这是正确的方法吗?
self.annotation = [[Annotation alloc] initWithCoordinate:location];
解决方法
self.annotation = [[[Annotation alloc] initWithCoordinate:location] autorelease];
因为annotation属性被声明为retain属性,所以赋值将增加其保留计数.
你也需要在-dealloc中发布self.annotation.
简而言之:
> init将retain count设置为1;
>分配给self.annotation,将其设置为2;
>当再次执行主循环时,autorelease会将其设置为1;
>在dealloc中释放会将retain count设置为0,这样对象就会被释放);
在我看来,考虑自动释放的最佳方法如下:autorelease将在未来的某些(接近)点“安排”对象的“自动”释放(通常在控制流程返回主循环时,但是细节隐藏在Apple手中).
autorelease主要与init结合使用,特别是在以下情况下:
>当你初始化一个局部变量时,你不必在它超出范围之前显式释放它(主循环会为你做这个);
>当你返回一个指向你刚刚创建的对象的指针而不保留它的所有权时(创建/生成*类型的选择器的典型情况,接收者需要保留它以获得所有权);
>具有保留的属性,当您为它们分配一个它们应该唯一拥有的对象时;
>使用增加保留计数的数据结构(NSMutableArray,NSMutableDictionary等):当您将新的对象添加到此类数据结构时,通常应自动释放该对象.
除了案例2之外,很明显自动释放的使用意味着提高代码的可读性并减少错误的可能性(这意味着在所有其他情况下,您可以简单地在分配后或在范围的结束).
使用属性时,您始终要检查它们是保留还是分配/复制大小写;在第一种情况下,将新的对象分配给属性通常需要自动释放.
无论如何,我建议至少略读memory management for iOS中的许多教程之一.