2010-11-03 71 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