2010-05-21 61 views
0

我正在修改QuartzDemo示例應用程序,並希望在其他已經包含的類中設置和讀取整數類型變量的值。如何設置和訪問另一個類的變量值

例如,在MainViewController.m中,我想將一個數值(從1-100的簡單數字)設置爲一個變量,然後該變量將在QuartzImages.m文件中調用(讀取)。

問題是如何正確定義變量,設置和訪問(讀取)值。

我所有與obj C和iPhone SDK一般初學者和有Delphi和VB的一些經驗,但是這並不能在所有幫助:)

謝謝誰,無論你在哪裏,人誰都會帶我離開這無盡的谷歌搜索循環。

回答

1

如果您有一個變量,有兩種方法可以讀取和設置屬性(通常是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。如果你是一個純粹主義者,除了訪問者,initdealloc(以及後兩者都有爭議),你甚至不應該直接訪問同一班級的ivars。

+0

謝謝你的回覆。這實際上令人困惑,我目前正試圖通過閱讀Apple提供的「C語言程序設計語言」這本書來解決這個問題,但是應該根據它們避免使用公共變量。 然後,正確的方法是什麼? 一個viewcontroller負責獲取用戶輸入,然後確定要分配給整數變量的數字。 之後,顯示另一個視圖控制器,該視圖控制器正在尋找這個數字。如何將1 .m文件中創建的簡單值傳遞給另一個.m文件?它感覺很簡單,但該死的難度 – BittenApple 2010-05-21 18:12:04

+0

(查看更新回答) – shosti 2010-05-21 19:07:58

+0

非常感謝你回答我的問題。我不知道你爲什麼花了這麼多精力寫出這樣詳細的解釋。像你這樣願意幫助的人現在很難遇到。再一次感謝你。 – BittenApple 2010-05-21 21:40:25