2010-03-30 32 views
5

Tôi thu thập điều đó trong Mục tiêu-C Tôi phải khai báo các biến mẫu như một phần của giao diện lớp của tôi ngay cả khi các biến này là chi tiết triển khai và có quyền truy cập riêng.Mục tiêu-C: cách ngăn chặn rò rỉ trừu tượng

Trong "chủ quan" C, tôi có thể khai báo một biến trong tệp .c của mình và nó không hiển thị bên ngoài đơn vị biên dịch đó. Tôi có thể khai báo nó trong tệp .h tương ứng, và sau đó bất kỳ ai liên kết trong đơn vị biên dịch đó đều có thể thấy biến đó.

Tôi tự hỏi nếu có một sự lựa chọn tương đương trong Mục tiêu-C, hoặc nếu tôi thực sự phải khai báo mọi ngà trong lớp .h cho lớp của tôi.

Ari.

+3

+1 và đối với ghi chú Chủ quan-C. –

Trả lời

2

Ari,

Một tài liệu tham khảo tốt để làm thế nào để hoàn thành "vô hình" dụ khai báo biến có thể be found here với tín dụng trân trọng trao cho Matt Gallagher.

Hy vọng nó sẽ giúp, Frank

+0

Phải. Các bit mà thực sự trả lời câu hỏi của tôi là tôi có thể đặt một phần của @interface trong tập tin .m của tôi. Cảm ơn bạn cho con trỏ. – iter

0

Để hạn chế truy cập, bạn có thể sử dụng @private hoặc @protected từ khóa:

@interface Foo : NSObject { 
    @private 
    int barPrivate; 

    @protected 
    int barProtected; 

    @public 
    int barPublic; 
} 
@end 

EDIT:Scratch tất cả mọi thứ, quay ra tôi thực sự cần ngủ một chút.

+0

Đúng vậy, bạn không thể thêm các biến mẫu với một danh mục. – codewarrior

+0

Vâng, tôi nhớ rằng ngay sau khi tôi đăng câu trả lời. –

+0

Tạo nhiều hơn một lần với các giá trị khác nhau cho 'bar' và bạn sẽ thấy -' bar' là một biến toàn cục. – Chuck

2

Các biến dụ có truyền thống được cần thiết để xác định kích thước của lớp. Nó luôn luôn là thực hành kém để trực tiếp truy cập vào các ivars, và đó không phải là điểm. Trong thời gian chạy hiện đại, điều này là ít cần thiết, nhưng ở mức độ nào, nó không phải là một sự rò rỉ trừu tượng trừ khi khách hàng dựa vào các ivars của lớp, điều này là không thể vì bạn tuyên bố chúng là @protected hoặc @private, phải không?

+0

Cảm ơn bạn đã chỉ ra ý định tích cực ban đầu của việc liệt kê một cách rõ ràng ivars. Tôi đã sử dụng các ngôn ngữ thực sự năng động (Python, Lisp) quá lâu, tôi quên rằng một số ngôn ngữ muốn biết kích thước tại thời gian biên dịch. Trong nhiều cách học Objective-C giống như một chuyến đi xuống làn đường bộ nhớ. Hoặc xuống một trục mỏ: Tôi có thể thấy tất cả các tầng trầm tích khác nhau tích tụ trong ngôn ngữ trong suốt cuộc đời của nó. – iter

+0

@iter: Sự cần thiết thậm chí không thực sự có trong Objective-C nữa. Thời gian chạy hiện đại hoạt động giống như Python, trong đó các biến mẫu có thể được gán tất cả mọi thứ mà không được khai báo trong một tiêu đề, nhưng ngôn ngữ vẫn mang theo cú pháp của quá khứ của nó. – Chuck

+0

Tôi nghĩ rằng tôi có thể đã chạy vào ngày này, mặc dù, khi tôi bắt đầu chạy vào các lỗi objc_msgSend_fixup liên tục. Tôi không chắc chắn 100%, nhưng vấn đề biến mất khi tôi gỡ bỏ object_setClass mà tôi đã sử dụng để đưa một đối tượng vào một lớp tùy chỉnh với các thuộc tính được thêm vào. –

0

ivars là @protected theo mặc định (mặc dù @private@protected không đảm bảo rằng các lớp khác không thể truy cập chúng - bạn luôn có thể truy cập vào ivars với getValue:forKey:). Bạn không bao giờ nên trực tiếp truy cập trực tiếp từ các lớp khác trong bất kỳ trường hợp nào - "sự lựa chọn" là liệu có phơi bày các ivars dưới dạng các thuộc tính hay không (bạn chỉ phải dựa vào tất cả các lớp theo quy ước để không truy cập trực tiếp vào ivars).

Trong thời gian chạy mục tiêu c mới, bạn không phải khai báo ivars vì chúng có thể được tổng hợp khi chạy, nhưng tiếc là không hoạt động với trình giả lập iPhone, vì vậy hiện tại, tốt nhất là để khai báo tất cả các ivars trong tập tin .h.

+0

Tôi lo lắng ít hơn về việc ngăn chặn mã khách hàng làm điều gì đó kỳ lạ với mã của tôi và nhiều hơn nữa về việc nói cho khách hàng lập trình nhiều hơn về việc triển khai của tôi hơn là anh ta muốn biết. Khi tôi đọc tệp .h, tôi muốn tìm hiểu hình dạng "bên ngoài" của thư viện mà tôi đang sử dụng. Nếu tôi muốn biết hoạt động bên trong của nó, tôi đọc .c hoặc .m như trường hợp có thể. Tôi muốn giữ hai điểm riêng biệt và riêng biệt này. – iter

+1

Tôi đồng ý - thật khó chịu khi các con ivars nằm trong tập tin .h, nhưng như đã đề cập ở trên, tôi nghĩ đó là vì lợi ích của trình biên dịch. – shosti

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