2013-03-13 55 views
0

我知道這可能是一個noob問題,但我有點困在這裏。我usualy作出如下訪問不同的應用ViewControllers數據:首先,我聲明global.h模塊這樣從老式的結構移動到類

global.h

typedef struct { 

    NSString *appName 
    NSString *appVersion; 

    bool mode; 

} structApp; 

extern structApp app; 

之後,我在MainViewController.h聲明結構,使我可以訪問數據

@implementation ViewController 

structApp app; 

- (void)viewDidLoad 
{ 
    app.appVersion = @"v1.02"; 
} 

@end 

然後我就包括「global.h」在每一個ViewController.h

這樣我可以在全球訪問。據我所知,這是一個很好的實現,我已經在20多個應用程序中使用它。問題在這個結構體大小增長時開始。在這些情況下,我看到損壞的內存,以前加載數據的零變量等。

有更好的方法使所有ViewController中的數據都可用?如果可以,請給我一些例子。

+1

可以使用Singleton模式。 – zakhej 2013-03-13 08:19:34

+1

提示:如果您將它包含在ProjectName-Prefix.pch文件中,則無需手動將其添加到每個文件 – Fonix 2013-03-13 09:05:44

+0

Nice tip @Fonix – 2013-03-13 09:12:32

回答

1

你有兩個選擇

  1. 使用一個單獨的類 - 請參閱Objective C Singleton
  2. 在應用程序委託聲明屬性 - 請參閱SO

您可以從任何類使用訪問應用程序的委託:

AppDelegate *appDel = [[UIApplication sharedApplication] delegate]; 
1

正如您在結構中使用extern所示,任何對象都會更新相同的值。

在OOPS中,全局變量永遠不會說好,所以你需要使用單例模式。

創建一個在你的結構中包含所有這些東西並使用它的單例/共享類。

0

您應該只有在處理原始數據時(如果您使用OOP方式)才能處理結構體。

app.appVersion = @"v1.02"; 

就懸擺指針的指向結構,因爲你是在一個函數範圍指向一個數據(app.appVersion只持有指針,而不是數據)。所以你必須保留所有這些對象值,以使其內容安全,但我必須承認它仍然是一種方法。

如果您需要全局訪問數據,則只有在您確實需要對數據進行強封裝和控制時纔可以使用單例。

如何讓一個單身 What should my Objective-C singleton look like?

您可以使用宏太,這樣你就可以使用常量字符串,而不必擔心數據的持久性,因爲他們永遠是可用到您正在處理的範圍。

0

一般情況下使用結構應該工作正常。使用它們沒有任何問題。如果你觀察到由於內存重疊或非法重複使用造成的奇怪值,那麼你的問題就在別的地方,但原則上並沒有在使用結構。extern聲明可能會導致這樣的問題。

從內存使用的角度來看,類不僅僅是一個結構。如果我是你,我會設計一個具有屬性的類,當你使用結構時你有成員。並以相同的方式利用它們。

對於「全局變量」,我應用了單例模式。這基本上是一個帶有類方法的類(前導+而不是 - ),它使類的唯一實例成爲可用。在該方法中,我檢查該類(對同一類的類內部靜態引用)是否已經可用(!= nil)並將其實例化。有時我使用初始化方法。初始化是一個典型的客觀事物。在課程第一次使用時或之前,每個課程只需調用一次,即使是次級課程。將類變量實例化爲單例的非常好的地方,但不能移植到其他編程語言。

0

如果你只是想讀取數據,你不需要任何複雜的數據結構,你也可以使用一個設置文件一樣

Settings.h

#define appName @"blabla" 
#define appVersion @"1.01" 
#define mode 1