2009-08-08 1 views

Trả lời

26

Có một vài cách khác nhau bạn có thể làm điều này:

  1. Thay vì tuyên bố nó như là một biến toàn cầu, bọc nó trong một đối tượng singleton, sau đó có singleton bởi có sẵn ở bất cứ đâu (bởi #importing sự .h tệp)

  2. Tạo tệp .h, như "Globals.h". Trong .h, khai báo mảng của bạn như extern NSMutableArray * myGlobalArray; Sau đó, trong một nơi khác trong ứng dụng của bạn (appdelegate là một nơi tốt), chỉ cần làm: myGlobalArray = [[NSMutableArray alloc] init]; Sau đó, bất cứ nơi nào bạn cần mảng, chỉ #import "Globals.h"

  3. này giống như # 2 , nhưng không có tiêu đề chung. Bạn có thể xác định mảng của mình là extern NSMutableArray *myGlobalArray; bên trong khối #ifdef __OBJC__ của tệp .pch của dự án. Tệp .pch là tệp tiêu đề được tự động #imported vào mọi tệp trong dự án của bạn.

Có ưu và khuyết điểm của mỗi cách tiếp cận. Tôi đã sử dụng cả ba lần tại các thời điểm khác nhau trong các trường hợp khác nhau. Tôi sẽ nói cách tiếp cận singleton có lẽ là thích hợp nhất, vì nó sẽ linh hoạt nhất để khởi tạo, hạn chế truy cập và quản lý bộ nhớ. Tuy nhiên, nó có thể là không cần thiết nếu bạn không cần điều đó.

Tùy chọn # 2 rất hay nếu bạn có nhiều biến "chung" mà bạn không muốn hiển thị cho mọi tệp trong toàn bộ dự án của mình. Bạn chỉ có thể #import nó khi cần thiết. Tuy nhiên, cách tiếp cận này (cũng như # 3) tách các khai báo khỏi khởi tạo (nghĩa là đối tượng không được tạo gần nơi nó được khai báo). Một số người có thể cho rằng điều này không đúng và có thể là chính xác.

Tùy chọn # 3 là tốt đẹp bởi vì sau đó bạn không bao giờ phải nhớ # import bất cứ điều gì cả. Tuy nhiên, nó đặt ra các câu hỏi giống như tùy chọn # 2.

+0

Hi i đã sử dụng tùy chọn thứ ba nhưng khi tôi sử dụng ** static extern NSMutableArray * myGlobalA rray; ** nó đưa ra lỗi ** Nhiều lớp lưu trữ trong bộ khai báo ** – rptwsthi

+1

@rptwsthi vâng xin lỗi. Chỉ cần loại bỏ bit "tĩnh". –

+0

lần cuối cùng tôi đã thất bại trong việc đạt được phản hồi mong muốn từ cách thứ ba, nhưng lần này tôi đã làm. Cảm ơn bạn đã đăng bài tốt đẹp này. :) – rptwsthi

8

Một câu trả lời thứ 4 là khai báo mảng trong UIApplicationDelegate bạn và truy cập nó thông qua

[[[UIApplication sharedApplication] delegate] myArray]; 

Dành cho những lúc tôi chỉ cần một số ít các đối tượng toàn cầu, tôi thấy đây là cách dễ nhất và sạch nhất để làm điều đó .

+6

+1 Đây cũng là một cách tiếp cận tốt. Chỉ báo trước điều này là nó sẽ tạo ra một cảnh báo trình biên dịch, vì - [UIApplication delegate] trả về một đối tượng kiểu id , mà không có phương thức "myArray". Các giải pháp sẽ được đúc nó, nhưng điều đó làm cho dòng hơi khó khăn hơn để sẵn sàng: '[(MyAppDelegate *) [[UIApplication sharedApplication] delegate] myArray];' –

+1

Plus, đúc nó có nghĩa là bạn cũng sẽ cần phải # import Tệp tiêu đề MyAppDelegate. –

+0

Tôi sử dụng Xcode 4.3. Tình huống mà bạn đề cập sẽ gây ra lỗi, không chỉ đơn thuần là cảnh báo. – Philip007

2

Nếu bạn đang xem xét lưu trữ một số loại tùy chọn được chia sẻ cho ứng dụng của mình, hãy sử dụng [NSUserDefaults sharedDefaults] để duy trì dữ liệu đơn giản có thể được sử dụng trên ứng dụng. Nếu bạn đang lưu trữ dữ liệu tạm thời, thì cách tiếp cận 'tĩnh' sẽ hoạt động như ở nơi khác.

Tuy nhiên, có thể tốt hơn khi sử dụng phương pháp tiếp cận đối tượng đơn lẻ với trình truy cập lớp, như NSUserDefaults và sau đó cung cấp các phương thức truy nhập mẫu để lấy dữ liệu của bạn. Bằng cách đó, bạn sẽ cô lập bản thân khỏi những thay đổi cấu trúc dữ liệu tiềm năng trong tương lai. Sau đó bạn sẽ sử dụng một var tĩnh, như trên, nhưng trong tệp .m (và do đó bạn không cần định nghĩa 'extern'). Nó thường sẽ trông như thế:

static Foo *myDefault = nil; 
@implementation Foo 
+(Foo)defaultFoo { 
    if(!myDefault) 
    myDefault = [[Foo alloc] init]; // effective memory leak 
    return myDefault; 
} 
@end 

Sau đó bạn sẽ phải accessors dụ, và sử dụng chúng như [[Foo defaultFoo] myArray] mà có thể được truy cập từ bất kỳ phần nào của ứng dụng, và không có bất kỳ lỗi thời gian biên dịch.

1

Mọi người ở đây dường như có một dòng ẩn, bỏ qua dòng đầu tiên: "Bạn có thể làm điều đó K & R-kiểu ..."

Vâng, bạn vẫn có thể làm điều đó C-style

Trong tập 1:.

NSArray *MyArray; 

Trong tập 2:.

extern NSArray *MyArray; 

Chơi Captain Obvious đây

+1

Nó không phải là rõ ràng, tôi nghĩ rằng nó khá phổ biến cho các nhà phát triển mới Obj-C không có kinh nghiệm C. – kubi

1

Để tham khảo câu trả lời của Dave tại đây:

Điều này giống như # 2, nhưng không có tiêu đề chung. Bạn có thể định nghĩa mảng của bạn là static extern NSMutableArray * myGlobalArray; bên trong #ifdef OBJC khối tệp .pch của dự án của bạn. Tệp .pch là tệp tiêu đề được tự động #imported vào mọi tệp trong dự án của bạn.

typedef là lớp lưu trữ và tĩnh là lớp lưu trữ và bạn chỉ có thể xác định đối tượng trong một lớp lưu trữ. Lấy "tĩnh" sẽ cho phép ứng dụng biên dịch với câu trả lời của bạn ở trên.

0

Có một số khả năng. Phổ biến nhất:

1 Sử dụng đối tượng singleton - http://www.galloway.me.uk/tutorials/singleton-classes/

2 Khai báo nó trong ứng dụng của đại biểu:

@interface Your_App_Delegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) NSArray *array; 
    . . . 

và truy cập nó:

((Your_App_Delegate*)[[UIApplication sharedApplication] delegate]).array; 

3 Sử dụng NSUserDefault