2009-07-06 48 views
66

Tôi không hiểu các biến tĩnh khi được định nghĩa trong việc triển khai giao diện. Trong các phương thức, tôi hiểu chúng khác nhau như thế nào so với các biến cục bộ, nhưng không phải khi được định nghĩa trực tiếp trong một thực thi.Ý nghĩa của các biến tĩnh trong việc triển khai giao diện là gì?

Xem các ví dụ sau. Sự khác biệt giữa hai loại thực tế này là gì?

#include "MyClass.h" 

@implementation MyClass 
int myInt; 
... 
@end 

Và:

#include "MyClass.h" 

@implementation MyClass 
static int myInt; 
... 
@end 

myInt là trong cả hai trường hợp có thể nhìn thấy tất cả các phương pháp, và nếu tôi giải thích một thử nghiệm tôi chạy một cách chính xác, myInt sẽ trong cả hai trường hợp là biến tương tự cho các trường hợp khác nhau lớp.

+0

Xem http://stackoverflow.com/a/4965145/654870 –

Trả lời

68

Từ khóa 'tĩnh' trong ngữ cảnh đó giống với từ khóa C: nó giới hạn phạm vi của myInt đối với tệp hiện tại.

+12

Ngoài ra, việc xác định một biến không địa phương bên @implementation không có khác biệt so với quy định nó bên ngoài. – sigjuice

+0

Nhưng điều này thực sự tạo ra bất kỳ sự khác biệt nào cho các định nghĩa trong các tệp triển khai?Chúng không được bao gồm. – quano

+8

Giả sử bạn khai báo int Varibale; trong hai tệp triển khai khác nhau. Bạn sẽ nhận được lỗi tại thời gian xây dựng, vì các biểu tượng trùng lặp. –

16

Từ Apple "Ngôn ngữ lập trình mục tiêu-C": "Khai báo biến tĩnh giới hạn phạm vi của lớp đó - và chỉ là một phần của lớp được triển khai trong tệp. , các biến tĩnh không thể được kế thừa bởi, hoặc được điều khiển trực tiếp bởi, các lớp con). "

80

Thật không may, nó có các hiệu ứng khác nhau tùy thuộc vào nơi bạn sử dụng.

Chức năng tĩnh:
Theo mặc định, tất cả các chức năng đều có phạm vi toàn cầu. Trình chỉ định tĩnh cho phép bạn giới hạn phạm vi chức năng của tệp hiện tại.

tĩnh Biến địa phương:
Khi bạn sử dụng modifier tĩnh trên một biến địa phương, chức năng “nhớ” giá trị của nó qua lời gọi. Ví dụ, biến currentCount trong đoạn mã sau không bao giờ được thiết lập lại, vì vậy thay vì lưu trữ số đếm trong một biến bên trong main(), chúng ta có thể cho countByTwo() ghi lại cho chúng ta.

// main.m 
#import <Foundation/Foundation.h> 

int countByTwo() { 
    static int currentCount = 0; 
    currentCount += 2; 
    return currentCount; 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog(@"%d", countByTwo()); // 2 
     NSLog(@"%d", countByTwo()); // 4 
     NSLog(@"%d", countByTwo()); // 6 
    } 
    return 0; 
} 

Việc sử dụng từ khóa tĩnh này không ảnh hưởng đến phạm vi biến cục bộ.
Đọc thêm về static keyword.

+6

Từ khóa tĩnh sẽ thực thi dòng của nó được thực hiện CHỈ một lần cho toàn bộ thời gian chạy ứng dụng - bất kể số lượng lời gọi là gì! – Honey

+0

Nơi nào trong bộ nhớ là biến tĩnh "currentCount" được lưu trữ? Nó không thể nằm trong khung countByTwo vì khung đó được deallocated khi hàm kết thúc. Vậy nó được lưu trữ ở đâu? – Enrique

16

"Trong cả C và Objective-C, biến tĩnh là một biến được phân bổ cho toàn bộ thời gian tồn tại của một chương trình. Điều này trái ngược với các biến tự động có thời gian tồn tại trong một cuộc gọi hàm duy nhất; các biến được phân bổ như các đối tượng, có thể được giải phóng khỏi bộ nhớ khi không còn được sử dụng nữa.Đơn giản hơn, giá trị của biến tĩnh được duy trì trong suốt tất cả các cuộc gọi hàm/phương thức. trong đó nó được khai báo, khi được khai báo bên trong một hàm hoặc phương thức, nó chỉ hiển thị trong hàm hoặc phương thức đó, nhưng giá trị được giữ lại giữa các cuộc gọi. "

Kiểm tra các giải thích đầy đủ ở đây:

https://stackoverflow.com/a/4965145/951349

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