2011-12-22 41 views
5

哪些以下目標c 2.0代碼段之間的差異(如果有的話):差(目標c 2.0)

// in MyClass.h 
@interface MyClass 
@private 
    NSString *myString; 
@end 

// in MyClass.m 
@interface MyClass() 
@property (nonatomic, copy) NSString *myString; 
@end 

@implementation MyClass 
@synthesize myString; 
@end 

回答

6

ivar(第一個)是一個普通變量,不能在創建的接口的實現範圍之外訪問(如果使用@private指令)並且沒有合成訪問器方法。

的性質(第二個)是一種包裹的ivar和東西,可以總是通過實例化一個類訪問,並具有合成存取方法(如果正在使用@synthesize指令)

MyClass *class = [[MyClass alloc] init]; 
[class setMyString:@"someString"]; //generated setter 
NSString *classString = [class myString]; //generated getter 
+0

在第二種情況下,我不要認爲myString的綜合getter/setter可以在實現範圍之外訪問。注意它們是在實現文件中的類擴展中。 – SundayMonday 2011-12-22 17:45:06

+0

對不起,我錯過了那部分。後者被認爲是在私人部分(與Apple的私有API相同,如UIView的-recirsiveDescription)。但它們仍然可以通過訪問器方法訪問,儘管編譯器會生成警告。第一個將不可訪問,因爲編譯器會產生錯誤。 – Eugene 2011-12-22 18:32:51