2010-06-21 61 views
2

所以我一直在做很多的閱讀。我已經能夠最終聲明一個外部MutableArray並從不同的視圖訪問它。我有兩個視圖: 1)測試視圖控制器 2)的Test2和extern NSMutableArray有什麼問題?

我聲明數組如下: TestingViewController.h

extern NSMutableArray *myArray; 

#import <UIKit/UIKit.h> 

@interface TestingViewController : UIViewController { 

} 

我初始化當陣列的TestingViewController載荷。 Test2.m

#import "Test2.h" 

NSMutableArray *myArray; 
@implementation Test2 

-(IBAction)addToArray{ 
[myArray addObject:@"Hot like Mexico"]; 
NSLog(@"Object was added to Array! Count: %d",[myArray count]); 
} 

它似乎是從兩個視圖工作: 然後我就可以如下從測試2對象添加到它。即使在切換時,計數和對象也是一致的。

我想知道的是,這有什麼問題?我知道很多經驗豐富的程序員討厭全局變量,但是我得到它的唯一方法就像上面和通過AppDelegate一樣(不想這樣做)。試圖更有效地添加和操作來自多個視圖的數組。

謝謝你們!

+0

Objective-C中的全局變量如果在一個文件中聲明,在另一個文件中初始化,然後在第三個文件中修改,可能會變得棘手。 – dreamlax 2010-06-21 04:47:03

+0

你會推薦什麼(請閱讀我的評論)? – Tony 2010-06-21 05:26:45

回答

2

如果你真的需要一個「全局」對象,這裏有一個簡單的模式,我使用了很多 - 嗯,不是很多,因爲我不傾向於有很多全局變量。

確定您希望它屬於哪個類。假設Test2是放入它的邏輯類。在Test2中創建一個方法來訪問該變量。(可能是類方法或實例方法)如下:

@interface Test2 : NSObject 
{ 
    // ivars 
} 

+(NSMutableArray*) myArray; // could also be an instance method 

@end 

@implementation Test2 

+(NSMutableArray*) myArray 
{ 
    static NSMutableArray* theValue = nil; 
    @synchronized([Test2 class]) // in a single threaded app you can omit the sync block 
    { 
     if (theValue == nil) 
     { 
      theValue = [[NSMutableArray alloc] init]; 
     } 
    } 
    return theValue; 
} 
@end 

編輯:使用類方法,來訪問myArray的從任何地方只是這樣做:

#import "Test2.h" 

// To use class method, send messages to the class itself 

[[Test2 myArray] addObject: @"foo bar"]; 
id foo = [[Test2 myArray] objectAtIndex: 0]; 
+0

如何從TestViewController或其他視圖訪問myArray? – Tony 2010-06-21 19:27:21

+0

請參閱上面的修改。 – JeremyP 2010-06-22 07:07:01

1

全局變量的問題是它們擴散。首先你有一個,然後你需要另一個,然後在你知道它之前,你有幾十個全局變量,你不確定哪些變量被初始化和釋放,並且每個變化都是永久的,因爲你不知道組件之間的依賴關係是什麼。

通常情況下,您需要擁有程序中每個資源的標識所有者。在Cocoa應用程序中,各種控制器和委託對象爲設計的各個部分提供了自然的責任層次。


對於您有您需要在您的應用程序的多個視圖訪問的對象的特定情況下,您通常可以使該對象通過您的視圖控制器類的方法,然後確保每個視圖有一個參考返回到控制器。

例如,查看UITableView的任何示例。這裏有一個相當複雜的數據源協議,但是其他的UIKit類有一個「委託」屬性,通常被初始化爲一個對象來管理他們的一部分狀態。

+0

如果你只需要一個可以從應用中的任何視圖訪問的數組,你會推薦做什麼?我還沒有看到一個有代碼的工作示例:\ – Tony 2010-06-21 05:25:55

+0

如何在我的視圖控制器中建立一個可以從另一個類訪問的方法,並從不同的視圖引用它? – Tony 2010-06-21 18:17:32

1

當涉及內存管理時,全局變量是噩夢,而這實際上並不是設計方面的典型做法。正確的做法是將myArray作爲TestingViewController中的一個屬性聲明,然後從Test2訪問該屬性。

+0

你如何管理?理論上我認爲你必須在Test2中創建TestingViewController類的對象,並以某種方式從Test2中訪問它。你能提供一些我可以看的示例代碼嗎? – Tony 2010-06-21 05:50:01

+0

如果您在Interface Builder的NIB中創建了TestViewController和Test2對象,那麼您可以使用IBOutlet從Test2中的TestViewController並將其鏈接起來。 – indragie 2010-06-21 18:32:08