2012-01-10 53 views
12

Làm thế nào để khai báo một biến trong file main.m để nó có sẵn trong tất cả các lớp học?Objective-C - biến toàn cục

Nếu tôi chỉ đơn giản khai báo nó trong hàm main, trình biên dịch cho biết nó chưa được khai báo trong phương thức lớp.

Tôi có phải khai báo nó trong một đối tượng như thế này?

@public 
type variable; 

Trả lời

25

Tất cả những gì bạn cần là sử dụng các biến toàn cầu C cũ thuần túy.

Đầu tiên, xác định một biến trong main.m của bạn, trước khi chức năng main của bạn:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

Thứ hai, bạn cần phải cho file nguồn khác biết về nó. Bạn cần phải khai báo nó trong một số .h file và import file đó trong tất cả các .m file bạn cần biến của bạn trong:

// .h file 

// Declaration of your variable.  
extern type variable; 

Lưu ý rằng bạn không thể gán giá trị cho biến trong khối tuyên bố, nếu không nó sẽ trở thành một định nghĩa về biến và bạn kết thúc với lỗi trình liên kết khiếu nại trên nhiều định nghĩa có cùng tên.

Để làm cho mọi việc rõ ràng: mỗi biến có thể tuyên bố nhiều lần (Tuyên bố nói rằng biến này tồn tại ở đâu đó), nhưng định nghĩa chỉ một lần (định nghĩa thực sự tạo ra bộ nhớ cho biến đó).

Nhưng hãy cẩn thận, biến toàn cục là một thực hành mã hóa xấu, bởi vì giá trị của chúng có thể được thay đổi bất ngờ trong bất kỳ các tập tin, vì vậy bạn có thể gặp khó lỗi debug. Bạn có thể tránh các biến toàn cầu bằng cách sử dụng mẫu Singleton, ví dụ.

+0

Imo, các biến toàn cầu thực sự làm cho rất nhiều ý nghĩa trong Objective C, do xu hướng cho rất nhiều thứ để tự nhiên được những người độc thân, đặc biệt là các bộ điều khiển xem. Trong trường hợp này, chúng hoạt động giống như hằng số hơn là các biến. – devios1

+0

Thực tế, người dùng sử dụng biến toàn cục - cá thể được chia sẻ -, do đó làm cho mọi thành viên toàn cầu; bạn chỉ thay thế một loại toàn cầu với một loại khác. – Cristik

10

Không thực sự chắc chắn lý do tại sao bạn muốn làm điều đó, nhưng bạn có thể nếu bạn muốn.

main.m:

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m:

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

Nhưng xin vui lòng, suy nghĩ cẩn thận trước khi bắt tay vào việc sử dụng một cái gì đó như thế này!

+0

Tại sao phải cẩn thận? Tôi không hiểu rủi ro sẽ là gì – Sirens

+1

Rủi ro sẽ là mã không thể duy trì hoặc có thể khó theo dõi lỗi. – mattjgalloway

+0

Mọi bài đăng tôi thấy trên Internet về các vars toàn cầu đều có cảnh báo về "cẩn thận" và một số người khác nói "tại sao phải cẩn thận?". Haha, nó luôn là Jazz. Những người không muốn cẩn thận: nghĩ rằng phải có một lý do ẩn khiến người khác cảnh báo bạn nhiều lần;) – tothemario

2

Bên cạnh đó gỡ lỗi, tôi thấy không có lý do gì để mặc thử và sửa đổi các tập tin main.m tương tác trực tiếp với logic ứng dụng của bạn.

Bạn có thể thử để xác định một hằng số trong hồ sơ Your_project_name_Prefix.pch, nếu phù hợp với nhu cầu của bạn. Hoặc khai báo biến tĩnh trên ủy nhiệm ứng dụng của bạn hoặc bất kỳ lớp nào trong ứng dụng của bạn.

Để tìm hiểu thêm về các hằng số và các biến tĩnh, hãy làm theo liên kết này:

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

Nhưng điều này không có tác dụng, nếu bạn cần đọc quyền truy cập vào var. E. g. nếu bạn muốn lưu trữ mật khẩu hoặc id phiên có thể truy cập được đối với tất cả các lớp. –

Các vấn đề liên quan