2009-05-18 75 views
0

我知道這是一個基本的任務,但我沒有找到一個好的答案。我有多個視圖控制器一個應用程序,我已經注意到,如果創建一個變量,並對其採取行動的一個控制器:iPhone上的變量的內存管理

int foo = 0; 
foo =+ 1; 

我可以宣佈在另一個控制器中的變量沒有初始化它的價值也將攜帶重視它上一次的設置在前面視圖控制器:

int foo; 
if (foo == 1) 
    doSomething; 

我已經使用這個我的優勢在多玩家遊戲等當前玩家跟蹤......使用多個控制器作爲其數據視圖被加載並刪除。我是Obj C的新手,基於我一直在閱讀的內容,這看起來並不是正確的方式。

所以這裏是我的問題,這是一個安全的方式來傳遞控制器之間的數據,如果不是我該怎麼做?

回答

1

這不是在控制器之間傳遞信息的安全方式。如果你在你的應用程序中使用它,並且它正在工作,我確實很驚訝。

正確的做法是將您需要的值從一個控制器傳遞到另一個控制器。下面的示例使用應用程序委託存儲值,然後每個控制器讀取/寫入數據... 這只是一個示例,請注意使用應用程序委託作爲存儲庫,以便成爲有效的全局變量。在應用程序委託中設置大量變量以便以這種方式使用會使您的應用程序難以維護。

在App Delegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate> { 
    int sharedInt; 
} 
@property int sharedInt; 

在App Delegate.m

@synthesize sharedInt; // this will automatically create the getters and setters 

然後在你想設置的值時,控制器:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate]; 
applicationDelegate.sharedInt = 3; 

然後在控制器中您想要讀取的值:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate]; 
if (applicationDelegate.sharedInt == 3) { 
    //do your stuff here 
} 

編輯:忘了@synthesize。
編輯:根據Kenneth Ballenegger的建議,從代理單例方法中輸入返回值,以消除編譯器警告。

+0

感謝您的詳細答案,因爲我對此很陌生,完整的代碼確實有幫助。我確實實現了這一點,它的效果很好。謝謝, – Aaron 2009-05-18 23:05:58

1

聽起來好像你正在聲明一個全局變量(這是C允許的),並且它不是在視圖控制器之間傳遞值的推薦做法。

您應該擁有一個包含您的狀態的對象,並將其傳遞給需要它的控制器。

1

我建議做(和做)類似於mmc的答案。不過,他的回答會讓你有很多警告。你應該確保你得到的是一個AppDelegate *對象,而不是任何(id)對象(就像你用mmc的方法做的那樣)。

只需添加一個+singleton(或+sharedDelegate)類的方法,以您的代理,像這樣:

+ (iLaughAppDelegate *)singleton 
{ 
    iLaughAppDelegate *delegate = (iLaughAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    return delegate; 
} 
+0

優秀的建議。我不經常使用這種模式,是的,這些警告會讓我神經緊張。 – mmc 2009-05-18 17:47:27

0

如果做得正確這是好的,但只應該只讀數據來完成。這是共享字符串常量的一種非常常見的方式。例如:

MyObject.h

extern NSString* const MyObjectWillChangeNotification; 

MyObject.m

NSString* const MyObjectWillChangeNotification = @"MyObjectWillChangeNotification"; 

AnotherObject.m

#import "MyObject.h" 
// You can now use MyObjectWillChangeNotification in this file 

同樣的過程將在技術上爲您int工作,但你不應該正如先前所指出的那樣。允許任何給定的變量由唯一的一個對象進行管理會更安全。其他人都應該通過訪問者來訪問它。