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
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.
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++.)
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:
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
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
- 1. Tôi có nên khai báo các phương pháp này không?
- 2. Tôi có phải đề cập đến các phương thức riêng tư trong tệp tiêu đề của một lớp không?
- 3. Quy tắc của phương thức khai báo trong Obj-c là gì? Tôi có thể sử dụng một phương thức mà không cần khai báo trực tiếp không?
- 4. Bạn có thể khai báo các phương thức không tham số trong Java để sử dụng trong Scala không?
- 5. Tôi có thể khai báo một chuỗi trong một tệp tiêu đề theo định nghĩa của một lớp không?
- 6. Tại sao chúng ta nên khai báo các phương thức giao diện là công khai?
- 7. #include tiêu đề có khai báo C trong tệp lắp ráp không có lỗi?
- 8. Kiểu lập trình khai báo phương thức của các biến phương thức get/set trong C++?
- 9. xCode/khai báo các phương thức tĩnh trong lớp
- 10. Tại sao tôi không thể định nghĩa các hàm C thuần túy trong tệp tiêu đề?
- 11. Tôi có thể tránh sử dụng tên lớp trong tệp .cpp nếu tôi khai báo không gian tên trong tiêu đề không?
- 12. Khai báo đối tượng lớp trong tệp tiêu đề
- 13. Khai báo vectơ trong tệp tiêu đề C++
- 14. Tôi có thể nội tuyến các phương thức lớp tĩnh trong Objective-C không?
- 15. Tại sao các biến được khai báo bằng "của chúng tôi" hiển thị trên các tệp?
- 16. Chúng ta có thể khai báo biến toàn cục trong tệp QML không?
- 17. Việc khai báo một phương thức trung bình của lớp Java có nghĩa là các phương thức mà nó gọi trong các lớp khác cũng là strictfp không?
- 18. Tôi có cần biên dịch các tệp tiêu đề trong chương trình C không?
- 19. Làm thế nào để khai báo các biến mẫu và các phương thức không hiển thị hoặc không thể sử dụng bên ngoài thể hiện của lớp?
- 20. Trong Java, có phải các biến được khai báo bên trong các phương thức tĩnh là tĩnh không?
- 21. Chúng tôi có thể triển khai các tùy chọn OpenID trong ứng dụng iPhone gốc không?
- 22. Tôi có thể khai báo và sử dụng các thực thể DTD trong App.config không?
- 23. Khi nào sử dụng các tệp Header không khai báo lớp nhưng có định nghĩa hàm
- 24. Tôi có nên giữ các biến chỉ được sử dụng trong một phương thức lớp cục bộ hoặc khai báo chúng dưới dạng thuộc tính lớp không?
- 25. Chúng ta có thể gọi phương thức service() từ phương thức destroy() trong Servlet không?
- 26. Có thể cache các phương thức POST trong HTTP không?
- 27. Các phương thức __init__ tiết trong Python có tệ không?
- 28. Làm thế nào để khai báo một lớp trong C# để tôi có thể xâu chuỗi các phương thức?
- 29. Khai báo mảng C++ trong tiêu đề
- 30. Chuyên môn thành viên của lớp mẫu mà không cần khai báo trong tiêu đề
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
@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 đó. –