有关@property和@synthesize的retain属性的问题

时间:2009-12-30 14:34:57

标签: objective-c

我对Objective-C编码仍然很陌生(正如这个问题所证明的那样),我想我并不完全理解在@property声明中如何使用retain属性。

以下是一个示例类:

@interface Foo : NSObject {
    NSMutableArray *myArray; 
}

@property (retain) NSMutableArray *myArray;

我的理解是将retain属性添加到@property声明(并在实现文件中使用必要的@synthesize delcaration)将基本上为我执行以下setter和getter:

- (void)setMyArray:(NSMutableArray *)newArray {
    myArray = [[NSMutableArray alloc] initWithArray:newArray];
    [newArray release];
}

- (NSMutableArray *)myArray {
    return myArray;
}

这是准确的还是我误解了retain属性的工作原理?

3 个答案:

答案 0 :(得分:5)

添加retain属性实际上会生成以下代码:

- (void)setMyArray:(NSMutableArray *)newArray {
    [newArray retain];
    [myArray release];
    myArray = newArray;
}

- (NSMutableArray *)myArray {
    return myArray;
}

在旧值上发布之前在newArray上调用保留方法的原因是,如果newArray和myArray是同一个对象,则数组将在它之前被释放再次保留。

答案 1 :(得分:1)

要做到这一点真的很难。看看Matt Gallagher撰写的关于Cocoa with Love的文章Memory and thread-safe custom property methods

这是一个实现,其工作受到that excellent article的启发。

- (void)setSomeString:(NSString *)aString {
    @synchronized(self)
    {
        if (someString != aString) // not necessary, but might improve
                                   // performance quite a bit
        {
            [aString retain];
            [someString release];
            someString = aString;
        }
    }
}

- (NSString *)someString {
    @synchronized(self)
    {
        id result = [someString retain];
    }
    return [result autorelease];
}

答案 2 :(得分:0)

retain不会复制新值。它将保留新值并释放旧值。

相关问题