2011-10-30 10 views
7

tôi thấy một ví dụ trong một cuốn sách cho thấy mã này:biến Tuyên bố trong @implementation

@implementation ViewController 
{ 
    NSString *name; 
} 

Tại sao không tuyên bố này trong @interface? Sự khác biệt trong việc khai báo biến trong @implementation thay vì @interface là gì? Tại sao phải khai báo số này NSString trong phạm vi?

Trả lời

8

Lợi thế của việc khai báo ivars trong phần @implementation là đóng gói tốt hơn. Bằng cách đó, các thanh ngang không phải xuất hiện trong tệp .h và do đó không hiển thị với người dùng bên ngoài lớp của bạn, những người chỉ có thể xem tệp tiêu đề. Điều này tốt hơn che giấu việc thực hiện nội bộ của lớp. Nói chung, bây giờ các thuộc tính có thể tự động tổng hợp ivars và ivars khác có thể được khai báo trực tiếp trong khối @implementation, tôi không thấy lý do tại sao bạn nên khai báo một ivars ở tất cả trong @interface của bạn (ngoài khả năng tương thích ngược).

Tại sao phải khai báo NSString này trong phạm vi?

Bởi vì đó là cách duy nhất để khai báo biến mẫu. Nếu không, bạn sẽ khai báo một biến có thể được truy cập từ bất cứ nơi nào trong cùng một tệp (xem câu hỏi BoltClock được liên kết trong nhận xét của mình).

+0

Vì vậy, nếu tôi tuyên bố rằng NSString ngoài phạm vi, nó sẽ trở thành một biến toàn cầu? Tôi có nghĩa là bất kỳ lớp học bên ngoài có thể truy cập các biến? –

+4

Sắp xếp; xem câu hỏi rằng một số suy nghĩ là một sự lừa đảo vì nó bao gồm sự khác biệt giữa ivars và globals/statics. Lưu ý rằng các khai báo ivar trong '@ implementation' là tương đối mới - không thể thực hiện được trong thời gian chạy Mac OS X 32 bit vì cách trình biên dịch tạo ra các lớp. Khi vấn đề "lớp cơ sở mong manh" đã được giải quyết, nó có thể làm tự động tổng hợp và/hoặc khai báo các mã vạch bên ngoài giao diện '@' chính. – bbum