微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

文件

@interface someViewController: UIViewController 
{
    Annotation *annotation;
}

@property (nonatomic,retain) Annotation *annotation;

@end

实施文件

@implementation someViewController
@synthesize annotation
@end

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

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

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

解决方法

这是对的:

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中的许多教程之一.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐