2011-03-12 52 views

回答

3

由於Objective C是使用' - >'語法(類似於(* obj).var)時C的超集,因此您正在訪問實例變量(ivar)結構(好吧,ObjC中的類只是奇特的C結構)。

因此使用'。'意味着你正在訪問該屬性。屬性是在Objective C 2.0中添加的功能,允許您通過setter/getter方法訪問您的ivars,這些方法可以自動創建(使用@synthesize),或者您可以提供自己的實現。順便說一句,物業擁有相應的伊娃是絕對沒有必要的。例如,在@interface聲明:

@interface Ololo : NSObject { 
//NOTE: there is no ivar named someText or _someText or whatever you want 
} 

@property(nonatomic) NSString* someText; 
@end 

然後在@implementation:

@implementation Ololo 
@dynamic someText; //we're using this to tell compiler that we will provide getters/setters ourselves and it doesn't need to generate them (though it is not necessary to do that) 

-(NSString*) someText { 
    return [NSString stringWithContentsOfFile: @"some_file_path"]; //we actually get value from file 
} 

-(void) setSomeText:(NSString*) str { 
    [@"asdas" writeToFile: @"some_file_path" atomically: YES]; 
} 

@end 

其實你可以做任何你在這些方法中想要的。所以用'。'只是[obj setSomeText: @"hello"]的快捷方式。

2

如果使用。您正在訪問您使用@property定義並使用@synthesize創建的類的屬性。如果你使用 - >你只是訪問一個實例變量,但它不是真的應該使用很多東西。而且使用非常有限。所以,不要讓自己變得困難,並使用屬性。

2

間接運算符( - >)從C繼承,可用作訪問結構中字段的簡寫形式,其中有指針。

舉個例子...

typedef struct IPhone { 
    int serialId; 
} IPhone; 

在這裏,我有一個傳統的C結構,我可以實例如下...

IPhone *phone = (IPhone*)malloc(sizeof(IPhone)); 

我們訪問它的字段我可以做到這一點很長的路...

*(phone).serialId = 1123432324; 

或者我可以使用簡寫間接操作符...

phone->serialiId = 1123432324; 

每個ObjectiveC類的核心是一個C結構。因此,當你使用間接運算符時,你要做的是跳回舊C語法,將後門程序轉換爲底層表示。它有效,但它不是規定的ObjectiveC方式。

2

object-> variable是直接訪問變量。 object.variable是根據上下文調用訪問方法'- (id)變量'或setter訪問器方法'- (void)setVariable:(id)value'的方法。您必須自己編寫訪問器方法,或者使用@synthesize生成它們以使用點語法。

良好的編程習慣決定了您總是使用訪問器方法從另一個實例訪問實例變量。即不使用 - >