如果您有一個變量,有兩種方法可以讀取和設置屬性(通常是ivar和accessor方法的組合)。舊的方式(有些還是首選)是直接使用存取方法:
//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]
新的方法是使用點語法(這僅適用於性能,並且不能用更復雜的方法使用):
int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]
如果這讓你,我會強烈建議撿的Aaron Hillegass's book副本。它詳細解釋了Cocoa和Objective-C。
編輯:我認爲這裏的一些混淆是術語。在Objective-C中,大多數對象都有實際存儲數據的實例變量(ivars)。但是,一般而言,您希望避免直接訪問ivars,特別是其他對象。 (這是面向對象設計的原則,是不是真的具體到Objective-C的。)
造成這種情況的主要原因是爲了增加靈活性 - 如果我有一類Person
具有可變age
一個實例例如,我可能想在未來改變我的實現來動態確定年齡。如果其他類依賴實例變量age
,則實現更改時它們將中斷。
解決此問題的方法是使用訪問器,這是訪問伊娃的方法。在Objective-C中,「getters」獲取變量,並且通常將其命名爲與變量相同的東西(因此在Person
示例中,獲取器將爲-(int)age
),「setters」設置該變量(它將被命名爲-(void)setAge:(int)theAge
)。如果你使用訪問器,你可以在將來自由地改變你的實現,甚至在必要時徹底擺脫伊娃,而不需要依賴班級。
在Objective-C中,ivar和accessors的組合通常被稱爲「屬性」(儘管如果該值是動態創建的,則不一定必須是ivar)。如果你認爲在屬性方面,你不必擔心其他類中的ivars - 他們是實現細節。 Objective-C的2.0有創建性一些不錯的語法糖:
//Person.h
@interface Person : NSObject {
int age;
}
@property (assign) int age; //declares the accessors
@end
//Person.m
@implementation Person
@synthesize age; //implements -(int)age and -(void)setAge:theAge
@end
要記住的重要一點是大部分的時間,你應該考慮在性能,而不是高德的方面。你不應該直接訪問其他類中的ivars。你應該很少(如果曾經)在超類中訪問ivars。如果你是一個純粹主義者,除了訪問者,init
和dealloc
(以及後兩者都有爭議),你甚至不應該直接訪問同一班級的ivars。
謝謝你的回覆。這實際上令人困惑,我目前正試圖通過閱讀Apple提供的「C語言程序設計語言」這本書來解決這個問題,但是應該根據它們避免使用公共變量。 然後,正確的方法是什麼? 一個viewcontroller負責獲取用戶輸入,然後確定要分配給整數變量的數字。 之後,顯示另一個視圖控制器,該視圖控制器正在尋找這個數字。如何將1 .m文件中創建的簡單值傳遞給另一個.m文件?它感覺很簡單,但該死的難度 – BittenApple 2010-05-21 18:12:04
(查看更新回答) – shosti 2010-05-21 19:07:58
非常感謝你回答我的問題。我不知道你爲什麼花了這麼多精力寫出這樣詳細的解釋。像你這樣願意幫助的人現在很難遇到。再一次感謝你。 – BittenApple 2010-05-21 21:40:25