2009-05-09 30 views
59

Tôi thấy một số mã ví dụ với [super viewDidLoad] được gọi trước khi triển khai và sau khi triển khai.`[super viewDidLoad]` convention

Tôi biết bạn không phải lúc nào cũng phải gọi siêu (như đã thấy trong nhiều cuộc thảo luận khác). Khi bạn gọi nó, dự kiến ​​trước hoặc sau khi bạn mã?

Điều này có thể có hậu quả tùy thuộc vào việc triển khai của siêu thực hiện. Mặc dù bạn không cần phải biết thực hiện của siêu để viết của bạn.

Tất nhiên điều này đi cho tất cả các phương pháp đại biểu UIViewControllers (willAppear, didAppear, vv ...)

Bất kỳ suy nghĩ?

+0

liên quan: http://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method – cregox

Trả lời

91

Quy tắc chung của tôi là: nếu bạn đang làm điều gì đó liên quan đến khởi tạo, trước tiên hãy gọi phương thức của lớp siêu hạng (nếu bạn định gọi nó). Điều này mang lại cho các siêu lớp một cơ hội để làm bất kỳ thiết lập mà bạn có thể dựa vào sau này trong phương pháp của bạn. Nếu bạn đang làm một cái gì đó liên quan đến sự hủy diệt, hãy gọi phương thức của lớp siêu cuối cùng. Điều này đảm bảo rằng bạn có thể dựa vào trạng thái của đối tượng trong suốt quá trình thực thi phương thức của bạn. Cuối cùng, thực hiện bất kỳ trường hợp nào khác theo từng trường hợp cụ thể. Ví dụ, nếu bạn đang xử lý một sự kiện, bạn có thể muốn xử lý sự kiện trước, và chỉ gọi phương thức của lớp siêu nếu bạn chọn không xử lý sự kiện hoặc nếu bạn bằng cách nào đó thay đổi nó và muốn truyền nó theo sự kiện chuỗi.

+7

Lời khuyên tốt từ Jason và thường là tài liệu của Apple trách nhiệm của lớp con khi nó quan trọng. Ví dụ. khi một số hành vi quan trọng phụ thuộc vào một cuộc gọi siêu, nó thường được đánh dấu trong tài liệu. Nói chung, nếu nó không làm tổn thương bạn, chỉ cần gọi qua siêu để an toàn. – danielpunkass

+0

Cảm ơn, đó là khá hợp lý và loại phương pháp tôi đã tham gia. Tôi đã phân lớp các lớp học của riêng mình và tôi đã có một sự lựa chọn về những việc cần làm. Tôi không muốn vi phạm quy ước bằng cách yêu cầu thiết lập trước/sau khi viewDidLoad. –

+3

Tất nhiên điều ngược lại của nó trong -dealloc, vì bạn có thể cần phải sử dụng một cái gì đó thuộc về siêu lớp trước khi nó được deallocated. – mk12

0

Cho phép nói rằng bạn có 2 lớp, một phụ huynh và trẻ em. Trẻ em được thừa kế từ cha mẹ. Họ có một phương thức gọi là chào trả về một chuỗi.

Dưới đây là những gì các phương pháp cha mẹ trông giống như:

Code:

-(NSString *)greet { 
return @"Hello"; 
} 

Chúng tôi muốn đứa trẻ để học hỏi từ cha mẹ. Vì vậy, chúng tôi sử dụng siêu để nói chào đón mẹ sẽ chào hỏi như thế nào, nhưng với những bổ sung nhỏ của chúng tôi.

Code: // Inherits từ Chánh

-(NSString *)greet { 
NSString *parentGreeting = [super greet]; 
return [parentGreeting stringByAppendingString:@", Mommy"] 
} 

Bây giờ Chánh chào "Hello", và trẻ em chào "Xin chào, Mẹ ơi". Sau đó, nếu chúng ta thay đổi lời chào của cha mẹ để trở về chỉ "Hi", thì cả hai lớp sẽ bị ảnh hưởng và bạn sẽ có "Hi" và "Xin chào, mẹ".

siêu được sử dụng để gọi một phương thức như được xác định bởi một siêu lớp. Nó được sử dụng để truy cập các phương thức đã được overriden bởi các lớp con để lớp có thể quấn mã riêng của nó xung quanh một phương thức mà lớp cha của nó thực hiện. Nó rất tiện dụng nếu bạn đang làm bất kỳ loại thừa kế nào cả.

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