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

cpj*_*eur 1 objective-c

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

这是一个示例类:

@interface Foo : NSObject {
    NSMutableArray *myArray; 
}

@property (retain) NSMutableArray *myArray;
Run Code Online (Sandbox Code Playgroud)

我的理解是,加入保留属性为@property申报(并使用在实现文件进行必要的@synthesize delcaration)将基本上做到以下setter和getter对我来说:

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

- (NSMutableArray *)myArray {
    return myArray;
}
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*ert 5

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

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

- (NSMutableArray *)myArray {
    return myArray;
}
Run Code Online (Sandbox Code Playgroud)

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