2010-11-03 74 views
1

test.h@synthesize in Objective-c?

NSString *name; 
@property(nonatomic,retain) NSString *name; 

test.m

@synthesize name; 

这里为什么要用非原子为什么我们使用保留产权,.m文件 @synthesize

请回答,

+1

您的标题与您的问题不符。 – DarkDust 2010-11-03 06:18:53

回答

1

nonatomic意味着设置该属性是不是线程安全的,retain意味着新的值会被保留(和旧的价值释放),以及@synthesize实际创建所必需的属性的方法。在这种情况下,它评估如下:

- (NSString *)name { 
    // Method "name", returning content of variable "name". 
    return name; 
} 

- (void)setName:(NSString *)newName { 
    [newName retain]; 
    [name release]; 
    name = newName; 
    // Also some magic for KVO is added here. 
} 
2

Apple Documentation

非原子详细here描述。

保留意味着,当值被设置为大于零的任何其他属性被保留。还有其他选项,如复制分配。通常,可复制的对象类型应使用复制,如NSString赋值只需设置指针值。

@synthesize存根出来的getter和setter方法的属性,并以订单所需非原子保留工作。

此外,确保,如果你使用保留副本,你也发布dealloc方法的对象。

- (void)dealloc { 
    [name release]; 
    [super dealloc]; 
} 
+0

'nonatomic'与线程安全无关。它只是意味着你将永远在线程环境中获得可行的价值。不保证是否正确(即原子性不是交易系统)。 – bbum 2010-11-03 06:23:06

+0

好帖子,但是当你不需要时,为什么你要“复制”对象?特别是如果你使用不可变的对象(如NSString),复制只会浪费内存。到目前为止,我很少发现需要“复制”。 – DarkDust 2010-11-03 06:26:31

+0

@DarkDust:每个NSMutableString都是一个有效的NSString。你不想意外地存储其中的一个,并让它在你的下面改变。大多数实现至少拷贝*的对象可能是可变的。因此,以这种方式声明所有属性是个好主意。而且,作为优化,NSString(不可变版本)只会在您将其复制时保留下来。 – Chuck 2010-11-03 06:33:29