2010-03-19 14 views
5

Vì vậy, tôi đọc this post và nó chính xác là những gì tôi đang tìm kiếm. Tuy nhiên ... nó không hoạt động. Tôi đoán tôi sẽ không đi với đối tượng singleton, mà là làm cho mảng trong tệp Global.h hoặc chèn nó vào tệp _Prefix.Làm thế nào để tạo ra một mảng toàn cầu?

Cả hai lần tôi làm điều đó mặc dù, tôi nhận được lỗi:

Dự kiến ​​specifier-vòng-list trước khi 'tĩnh'

và nó không hoạt động. Vì vậy ... Tôi không chắc chắn làm thế nào để có được nó để làm việc, tôi có thể loại bỏ extern và nó hoạt động, nhưng tôi cảm thấy như tôi cần điều đó để làm cho nó một hằng số.

Mục tiêu cuối cùng là để có Mutable Array này có thể truy cập được từ bất kỳ đối tượng hoặc tệp nào trong dự án của tôi. Trợ giúp sẽ được đánh giá cao!

Đây là mã cho file Globals.h tôi:

#import <Foundation/Foundation.h> 

static extern NSMutableArray * myGlobalArray; 

Tôi không nghĩ rằng tôi cần bất cứ điều gì trong file thực thi. Nếu tôi đã đặt nó trong tập tin tiền tố, lỗi là như nhau.

EDIT

Vì vậy, tôi loại bỏ các tập tin .m từ Globals, và tôi chỉ có mã về trong Globals.h. Giả sử tôi sẽ tiếp tục thực hành khủng khiếp này về việc có các biến toàn cầu (tôi biết nó xấu, tôi chỉ muốn thử nghiệm điều này), bây giờ tôi có một lỗi mới. Nó nói:

"Nhiều lớp lưu trữ trong specifiers khai"

Nếu tôi loại bỏ "extern" nó hoạt động và nếu tôi loại bỏ "tĩnh" nó hoạt động, nhưng có cả hai không ... những gì bây giờ?

**** đúp Sửa ****

xét đúng, vì vậy tôi đã cố gắng thêm các mảng để UIApplication Đại biểu của tôi, nhưng tôi đang làm nó sai vì nó không được làm việc. Ai đó có thể cho tôi một số mã ví dụ như nơi để đặt nó một truy cập không? Tôi không biết nếu nó nên đi trong việc thực hiện, hoặc ở một nơi khác, và một khi mảng được khởi tạo như thế nào để truy cập nó từ các tập tin khác ... Tôi có đặt một biến mới cho mảng, hoặc một cái gì đó?

+0

Bạn có thể đăng mã của mình không? –

Trả lời

3

Chỉ là đề xuất lập trình chung - không chia sẻ một mảng. Bạn không có quyền kiểm soát nó và nó sẽ hầu như không thể theo dõi nếu một cái gì đó thay đổi nó tại một thời điểm và theo cách bạn không mong đợi.

Thay vào đó, hãy tạo một đối tượng có mảng bên trong nó và làm cho đối tượng đó trở thành một singleton (hoặc tốt hơn là tạo một nhà máy cho nó).

Bất cứ khi nào bạn muốn sửa đổi mảng của mình, hãy gọi phương thức trên đối tượng để làm như vậy. Nếu bạn làm điều này, tôi đặt cược bạn sẽ tìm thấy rất nhiều mã dư thừa mà bạn có thể đưa vào đối tượng này (ví dụ, tìm kiếm mảng cho một giá trị - thực hiện phương thức "tìm kiếm" trong đối tượng thay thế và truyền vào một giá trị).

Nó có vẻ như rất nhiều công việc bạn không cần phải làm, nhưng bạn sẽ thấy công việc khá thú vị, và bạn sẽ thấy rằng bạn phải làm điều đó một khi bạn thấy có bao nhiêu mã thuộc về điều này vật...

2

Hai (chính) cách làm một mảng toàn cầu riêng biệt - một trong hai bạn có một lớp học với một phương pháp

static NSMutableArray *foo; 
+(NSMutableArray *)foo { 
    return foo; 
} 

(trong file .m) với mảnh tĩnh KHÔNG trong file header , hoặc chỉ

static extern NSMutableArray * myGlobalArray; 

với các wrapper singleton (mà tôi nghĩ là tốt hơn vì nó giúp bạn tiết kiệm từ việc có thêm một chút về mã không cần thiết)

Dù bằng cách nào, nó vẫn là một thực tế xấu t mũ tôi sẽ cố gắng tránh.

0
#import <Foundation/Foundation.h> 

static extern NSMutableArray * myGlobalArray; 

@interface Globals : NSObject { 
} 


@end 
1

Nói chung, sự hiện diện của tệp "Globals.h" là mùi hôi có một mẫu antipattern tại nơi làm việc.

Tôi thậm chí sẽ tư vấn cho lời khuyên của Bill K và không sử dụng mẫu Singleton chút nào.

Thay vào đó, hãy tạo mảng trong ủy nhiệm ứng dụng của bạn và chuyển nó tới bộ điều khiển chế độ xem gốc của bạn và dọc theo cấu trúc phân cấp đến các thành phần cần truy cập vào nó.

3

Chỉ cần thêm mảng như một tài sản của các đại biểu ứng dụng và truy cập nó thích:

[[UIApplication sharedApplication] myArray];