2010-10-11 28 views
22

Cách tốt nhất khi sử dụng [super ... any method name]. Gần đây tôi đã phát hiện ra rằng Trong dealloc các [super dealloc] phải đứng trong cùng một kết thúc. Vì bất kỳ biến nào không sử dụng trước đây có thể được lấp đầy bởi rác nếu chúng ta đặt sau [super dealloc] Đó là một điều hiếm hoi, nhưng có thể. Sau này, chúng tôi sẽ có sự cố trong ứng dụng của chúng tôi.Khi nào tôi nên gọi siêu?

Vì vậy, cách tốt nhất để sử dụng phương pháp siêu, ví dụ: cách tốt nhất là sử dụng cho -(void)viewWillAppear:(BOOL)animated. Đâu là nơi tốt nhất cho [super viewWillAppear:(BOOL)animated] khi bắt đầu cơ thể hoặc cuối cùng?

Trả lời

50

Quy tắc chung của ngón tay cái là khi bạn ghi đè phương pháp thực hiện một số loại khởi tạo, bạn gọi siêu trước và sau đó thực hiện công cụ của mình. Và khi bạn ghi đè lên một số loại phương pháp teardown, bạn gọi siêu lần cuối:

- (void) setupSomething { 
    [super setupSomething]; 
    … 
} 

- (void) tearDownSomething { 
    … 
    [super tearDownSomething]; 
} 

Các loại đầu tiên là phương pháp như init…, viewWillAppear, viewDidLoad hoặc setUp. Thứ hai là những thứ như dealloc, viewDidUnload, viewWillDisappear hoặc tearDown. Đây không phải là quy tắc cứng, nó chỉ sau những điều mà các phương pháp làm.

+1

Cảm ơn, đó là quy tắc thực hành tốt. –

+1

cũng đáng chú ý là dưới ** ARC ** bạn không cần phải gọi '[super dealloc]' ở tất cả trong thực thi 'dealloc' –

+3

Nó thậm chí không thể, trình biên dịch sẽ đánh bạn nếu bạn làm vậy. – zoul

3

Chủ yếu phụ thuộc vào việc lớp con của bạn có cần điều gì xảy ra trước phương thức siêu lớp hay sau. Hoặc cả hai, như trường hợp có thể được.

Đó là lý do tại sao phương thức init gọi phương thức siêu đầu tiên và phương thức dealloc là điều cuối cùng. Trong ví dụ của bạn, khi bạn đang được thông báo rằng một khung nhìn sẽ xuất hiện, bạn có thể muốn để siêu làm điều đó, và sau đó, hãy quan tâm đến bất kỳ khung nhìn lớp con nào của bạn cần làm. Nhưng nó có thể hình dung theo cách khác, hoặc bạn có thể gọi phương thức siêu ở giữa mã của bạn. Các quy tắc khác nhau sẽ áp dụng theo nhu cầu của ứng dụng của bạn.

15

Chỉ cần kiểm tra tài liệu tương ứng. Ví dụ, khi gọi siêu trong các phương pháp ghi đè của UIViewController:

didReceiveMemoryWarning: Bạn có thể ghi đè lên phương pháp này (khi cần thiết) để phát hành bất kỳ bộ nhớ thêm được sử dụng bởi điều khiển tầm nhìn của bạn. Nếu bạn làm như vậy, hãy chắc chắn gọi số siêu triển khai tại một số điểm để cho phép chế độ xem điều khiển để giải phóng chế độ xem. [Có nghĩa là thứ tự là không quan trọng.]

loadView: thực hiện tùy chỉnh của bạn của phương pháp này không nên gọi siêu.

setEditing: animated: Phương pháp này nên gọi siêu ‘s thực hiện trước khi cập nhật điểm của mình. [Có nghĩa là thứ tự quan trọng.]

viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear: Nếu bạn ghi đè phương pháp này, bạn phải gọi siêu tại một số điểm trong việc thực hiện của bạn. [Có nghĩa là thứ tự là không quan trọng.]

dealloc: Nếu bạn thực hiện phương pháp này nhưng đang xây dựng ứng dụng của bạn cho iOS 2.x, phương pháp dealloc của bạn nên phát hành từng đối tượng nhưng cũng nên đặt tham chiếu đến đối tượng đó thành trước khi gọi siêu. [Có nghĩa là thứ tự là quan trọng.]

Bạn có nhận ra quy tắc tương tự cho siêu trong các phương pháp viewDidLoad và viewDidUnload không được đề cập? Bởi vì bạn không cần phải gọi siêu trong số này.

+1

Một lời cảnh cáo: Người ta phải cẩn thận khi xử lý các phân cấp sâu hơn. Nếu A kế thừa từ UIVIewController và ghi đè viewDidLoad và B kế thừa từ A và cũng ghi đè viewDidLoad, có thể trường hợp gửi [super viewDidLoad] trong triển khai B là bắt buộc. Như Comptrol đã nói, tài liệu của A nên làm rõ điều đó và nhà phát triển triển khai B nên đọc tài liệu của A. –

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