2012-01-12 37 views
6

Tôi đang xem video khóa học Phát triển ứng dụng iPhone và iPad của Đại học Stanford. Người hướng dẫn nói trong video chúng ta có thể điều khiển-kéo một đối tượng UI vào các tệp triển khai để tạo một hành động. Nhưng theo cách này, phương thức sẽ không khai báo trong tệp tiêu đề. Điều này có nghĩa là nó là ok để thực hiện các phương pháp trong tập tin .m nhưng không khai báo trong tập tin .h?Chúng tôi có thể không khai báo các phương thức trong các tệp tiêu đề không?

Trả lời

6

Phụ thuộc vào cách bạn định nghĩa "ok" :-)

Objective-C sử dụng phương pháp năng động tra cứu và không thực sự thực thi quyền truy cập (các thông số "riêng tư", "công khai", v.v.). Vì vậy, bạn không cần cần để khai báo bất kỳ phương thức nào trong tệp tiêu đề.

Tuy nhiên bạn sẽ kết thúc chiến đấu với trình biên dịch vì nó thực hiện kiểm tra loại trừ khi bạn không thuyết phục, và bạn sẽ thua bằng cách làm như vậy.

5

Bạn không bắt buộc phải khai báo trong tệp tiêu đề tất cả các phương pháp trong quá trình triển khai. Nhưng nếu không có trong tập tin tiêu đề rõ ràng bạn không thể tham chiếu chúng bằng tên chữ trong tập tin khác, bạn cũng không thể "chuyển tiếp tham chiếu" chúng trong tệp triển khai.

(Lưu ý rằng đây không phải là khác nhau từ C thường xuyên, nhưng khác với các phương pháp của một lớp trong C++.)

+0

Hành vi của trình biên dịch dường như đã thay đổi một chút trong Xcode 4.5. Tôi có một loạt các phương pháp mà tôi đã không khai báo trong .h và tôi nhận được không có lỗi trình biên dịch. Tuy nhiên, khi tôi đưa mã này vào Xcode 4.2 để tôi có thể kiểm tra khả năng tương thích với iOS 4.3, trình biên dịch sẽ phát ra lỗi. – JScarry

+0

@JScarry - Tôi đã nhận thấy hành vi tương tự, mặc dù nó có vẻ khác nhau với một số loại cờ biên dịch. Nhưng Xcode 4.5 đang đẩy việc sử dụng một phiên bản '()' của '@ interface' trong .m, và bạn có thể gắn tất cả các khai báo nội bộ vào đó. –

5

Nó "OK" để không công bố phương pháp trong tiêu đề có, trong những trường hợp nhất định. Ví dụ, nếu sử dụng ARC thì trình biên dịch thường cần biết chữ ký của phương thức để nó có thể làm điều đúng. Nhưng về cơ bản tất cả nó có nghĩa là bất cứ nơi nào bạn đang sử dụng phương pháp, nó phải đã biết về phương pháp bạn đang gọi.

Vì bạn đang nói về Trình xây dựng giao diện, có một chút khác biệt ở chỗ nó sẽ biết về tất cả các phương pháp vì nó có thể "xem" toàn bộ ngữ cảnh của tệp tiêu đề và tệp triển khai của bạn và biết rằng phương thức tồn tại. tức là trong thuật ngữ của tôi ở trên, phương pháp đã được xác định trước khi nó được sử dụng.

liên quan đến việc xác định trước khi sử dụng Với, cách tiếp cận được chấp nhận chung là một trong hai:

  1. Xác định một phương pháp trong file giao diện (.h). ví dụ .:

    MyClass.h

    @interface MyClass : NSObject 
    - (void)someMethod; 
    @end 
    

    MyClass.m

    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
  2. Xác định một phương pháp trong một loại lớp tiếp tục. ví dụ:

    MyClass.h

    @interface MyClass : NSObject 
    @end 
    

    MyClass.m

    @interface MyClass() 
    - (void)someMethod; 
    @end 
    
    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
Các vấn đề liên quan