使用点语法设置retain属性时使用autorelease?

我发现在一些示例代码中使用了autorelease 。 在需要时我不熟悉这些实例。 例如,如果我创建一个注释对象

头文件

@interface someViewController: UIViewController 
{
    Annotation *annotation;
}

@property (nonatomic, retain) Annotation *annotation;

@end

实施文件

@implementation someViewController
@synthesize annotation
@end

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

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

我需要为此设置autorelease吗? 或者我可以按照正常的方式进行操作,并在dealloc方法中添加发布版本?


这是对的:

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

因为注解属性被声明为保留属性,所以分配给它会增加其保留计数。

你也需要,在-dealloc释放-dealloc

简而言之:

  • init会将保留计数设置为1;

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

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

  • 释放dealloc将设置保留计数为0,以便该对象将被释放);

  • 在我看来, autorelease的最佳方式如下: autorelease将在未来的某个点(接近)为你的对象“安排”一个“自动” release (通常当控制流返回主循环时,但细节隐藏在苹果手中)。

    autorelease主要与init结合使用,特别是在以下情况下:

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

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

  • 当你为它们指定一个他们应该拥有唯一的对象时, retain这些属性;

  • 使用增加保留计数的数据结构( NSMutableArrayNSMutableDictionary等):当你将它添加到这样的数据结构中时,通常应该autorelease一个新init对象。

  • 除了案例2,显而易见的是,使用autorelease是为了提高代码的可读性,并减少错误(这意味着在所有的其他情况下,你可以简单地潜力release明确后转让或在你的对象范围的末尾)。

    当使用属性时,你总是要检查它们是否属于retainassign / copy情况; 在第一种情况下,分配新init ED对象的属性通常需要autorelease

    无论如何,我会建议至少浏览一下iOS内存管理教程。


    Autorelease在离开示波器之前告诉对象释放自己。

    有时当你编码时,你会遇到这样的事情

    - (void)doSomething
    {
        if(true)
        {
            NSString *foo = [[NSString alloc] initWithString:@"foo"];
    
            //Some execution here
    
            [foo release];
        }
    }
    
    - (void)doSomething
    {
        if(true)
        {
            //By doing this is telling to to release foo object before getting out of the scope
            //which is similar with above practice
            NSString *foo = [[[NSString alloc] initWithString:@"foo"] autorelease];
    
            //Or you can do it this way
            NSString *foo = [[NSString alloc] initWithString:@"foo"];
            [foo autorelease];
    
            //Some execution carry on, it'll release foo before entering next scope
    
        }
    

    //这超出了范围}

    当然,释放对象并不意味着释放对象。 有时你保留这个对象,所以你仍然可以在它的范围之外使用它。

    从你的问题来看,如果你的对象位于你的头文件/接口。 您应该使用dealloc方法释放它。 CMIIW。

    链接地址: http://www.djcxy.com/p/53275.html

    上一篇: Use autorelease when setting a retain property using dot syntax?

    下一篇: Autorelease NSString