2012-01-03 31 views
15

Giả sử tôi có bộ điều khiển xem hoặc bộ điều khiển cửa sổ, (như thường lệ) "Chủ sở hữu tệp" trong tệp XIB tương ứng.Các biến mẫu IBOutlet trong các tệp thực thi (.m)

Đó là (như bạn đã biết) rất phổ biến khi có IBOutlet s trong lớp bộ điều khiển mà sau đó bạn có thể kết nối trong XIB bằng cách sử dụng Trình tạo giao diện.

Cho đến bây giờ, tôi đã tạo IBOutlet biến mẫu trong các tệp giao diện (.h) của tôi. Nhưng (như bạn đã biết) IBOutlet s thường là một cơ chế riêng của lớp điều khiển; người ngoài không nên biết về họ.

Đây là lý do tôi bây giờ — vì Objective-C gần đây đã bắt đầu cung cấp khả năng làm như vậy - muốn đặt tất cả các tệp IBOutlet của tôi vào tệp triển khai (.m) của tôi.

Tôi đã thử làm điều này và điều này có vẻ hoạt động tốt. Câu hỏi của tôi là: Tại sao tính năng này hoạt động? Tôi đã có ấn tượng rằng Trình tạo giao diện chỉ có thể xem các tệp tiêu đề của lớp — chứ không xem trước các tệp triển khai của chúng. Liệu tôi có sai? Trình xây dựng giao diện có thể "xem" các tệp triển khai như thế nào? Có thể nguy hiểm khi đặt IBOutlet biến mẫu vào các tệp triển khai không?

+1

Lưu ý rằng điều này chỉ có thể xảy ra khi sử dụng thời gian chạy hiện đại trên máy Mac, có nghĩa là chỉ 64 bit. Thời gian chạy cổ điển yêu cầu tất cả các ivars phải được khai báo trong tiêu đề. –

Trả lời

12

Từ Xcode 4 User Guide

Lưu ý: Bởi vì Xcode 4 phân tích cả hai tập tin tiêu đề của bạn và thực hiện file cho chỉ mục, bạn có thể xác định các hành động và các cửa hàng trong thực hiện (.m) tập tin mà không cần phải đặt chúng trong tiêu đề tệp và bạn có thể tạo kết nối trực tiếp từ tệp nib tới tệp triển khai . Do đó, bạn không cần hiển thị các phần của giao diện hoặc hành động của bạn cho những khách hàng có thể đang sử dụng các lớp học của bạn.

Và đối với Có thể nguy hiểm tiềm ẩn khi đặt các biến mẫu IBOutlet vào tệp triển khai không?

Có, nhưng không nhiều như bất kỳ phương thức khai báo nào có thể được truy cập do thiếu phạm vi truy cập khi chạy. Ngay cả khi phương pháp này không thể truy cập được, độ phân giải được thực hiện trong thời gian chạy và không có thông tin phạm vi truy cập nào được đính kèm với phương thức. Điều đó có thể đã được triển khai, nhưng Mục tiêu-C thiếu private, protected và cứ như trong C++ hoặc Java. Lưu ý rằng việc thực hiện hành vi như vậy sẽ chậm hơn nhiều trong thời gian chạy.

+1

Bạn có thể giải thích tại sao sử dụng IBOutlet ivars trong các tệp triển khai có khả năng gây nguy hiểm không? –

+0

Bởi vì điều đó có nghĩa là một số mã của bạn cố ý truy cập vào dữ liệu cá nhân của bạn do thiết kế nguy hiểm và chống lại mô hình OOP – Geoffroy

+0

@Geoffroy, do đó bạn nghĩ rằng có 'IBOutlet' và 'IBAction' nằm trong tệp triển khai chỉ có? – Enchilada

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