我对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属性的工作原理?
答案 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
不会复制新值。它将保留新值并释放旧值。