2014-09-08 21 views
11

Rất nhiều lớp UIKit có thể được phân lớp, nhưng tài liệu yêu cầu một số phương pháp nhất định, nếu bị ghi đè, phải chắc chắn vẫn gọi tới số super. Ví dụ:Tại sao các phương thức UIKit không sử dụng NS_REQUIRES_SUPER?

-[UIViewController viewWillAppear:] 
-[UITableViewCell didTransitionToState:] 
<every method UIPercentDrivenInteractiveTransition declares> 

Tại sao của Apple chọn không thêm NS_REQUIRES_SUPER cho các Tờ khai những phương pháp này, vì họ làm thực sự "yêu cầu siêu"? Suy nghĩ đầu tiên của tôi là khả năng tương thích ngược với các phiên bản trước đó của clang, nhưng thậm chí đó không phải là vấn đề, tôi nghĩ rằng, sau khi đọc đoạn trích dẫn tài liệu sau:

Lưu ý rằng trên cả OS X và iOS macro tiện NS_REQUIRES_SUPER cung cấp cú pháp đường cho thuộc tính này:

- (void)foo NS_REQUIRES_SUPER;

macro này có điều kiện được xác định tùy thuộc vào sự hỗ trợ của trình biên dịch cho thuộc tính này. Nếu trình biên dịch không hỗ trợ thuộc tính, macro sẽ mở rộng thành không có gì.

+5

Câu hỏi này chỉ thực sự được trả lời bởi những người chịu trách nhiệm về các API đó. Đó là một sai lầm khi nghĩ rằng Apple là một bên có trách nhiệm duy nhất. Các nhà phát triển cá nhân đã viết các API đó và một số người trong số họ có thể không biết về 'NS_REQUIRES_SUPER' hoặc đơn giản là quên nó. Dù sao, hai cái đầu tiên bạn đã đề cập trước 'NS_REQUIRES_SUPER' nên có lẽ họ chỉ đơn giản là không chú ý đến hai chú thích đó, hoặc chúng không chú thích chúng để tránh phá vỡ mã nguồn xảy ra để hoạt động mặc dù không gọi siêu. –

+0

Những gì Rob nói, một giải pháp có thể mặc dù sẽ là https://gist.github.com/steipete/5626678 –

+0

Tôi tin rằng thay vì buộc nhà phát triển gọi 'super', họ đã quyết định viết lại API. Lý tưởng nhất, khi ghi đè một phương pháp được thực hiện để được overriden, bạn không cần phải gọi 'super'. Lưu ý rằng tất cả các phương thức 'UIViewController.viewWill/Did ...' hiện nói "mặc định không có gì" hoặc "mặc định là nop". Đây là giải pháp tốt hơn là chỉ đánh dấu phương thức với cờ trình biên dịch. Tuy nhiên, cũng lưu ý rằng khi ghi đè một phương thức, bạn nên (hầu như) luôn gọi 'super'; điều đó có nghĩa là họ sẽ phải thêm cờ cơ bản vào mọi phương thức trong API. – Sulthan

Trả lời

0

Vì đó là chú thích tương đối mới và mọi người chưa thực hiện công việc để áp dụng chú thích cho api (rất lớn).

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