2013-02-07 36 views
10
-(NSString *) nibName 
{ 
    PO([self class]); 
    PO([super class]); 
    PO([self superclass]); 

Chỉ có [self superclass] tạo lớp siêu thực tế.Tại sao [super class] và [self class] tạo ra cùng một kết quả?

[self class]: BGImageForBizs 
[super class]: BGImageForBizs 
[self superclass]: BGUIImageWithActivityIndicator 
+0

Tôi không biết Obj-C, nhưng điều đó có mùi giống như các phương pháp ảo cho tôi –

+0

Xem thêm: [Đang gọi siêu trong một danh mục giống như gọi nó trong một phân lớp?] (Http://stackoverflow.com/ q/6168058) –

Trả lời

10

Gửi thư bằng cách sử dụng super cũng giống như gửi thư đến self, nhưng sử dụng rõ ràng cách triển khai phương thức của lớp cha. Nhưng lớp của bạn có thể không thực hiện chính phương thức -class, vì vậy bạn đã thừa kế việc triển khai -class từ lớp cha của bạn rồi.

Thực tế, có thể bạn đang thừa kế việc thực hiện NSObject-class (ngay cả khi NSObject không phải là siêu lớp trực tiếp của bạn; -class không phải là phương pháp thường xuyên bị ghi đè). Và việc triển khai mặc định chỉ trả về nội dung của con trỏ isa của đối tượng, cho bạn biết số Class là gì.

Nói cách khác, điều quan trọng là phải nhận ra rằng việc gọi super không biến đổi hoàn toàn đối tượng của bạn thành một thể hiện của siêu lớp; nó chỉ chạy mã superclass 'cho phương thức đó. Nếu có bất kỳ sự mâu thuẫn nào xảy ra trong mã đó, nó vẫn thấy đối tượng của bạn như là một thể hiện của bất kỳ lớp nào mà nó bắt đầu.

+0

Cả hai đều tốt, cái này toàn diện hơn. –

9

tự và siêu là cùng một đối tượng. Điều duy nhất siêu làm là kiểm soát việc thực thi phương thức nào được gọi. Vì cả lớp và lớp cha của bạn đang sử dụng lớp thực thi của lớp NSObject, nên cùng một phương thức được gọi trong cả hai trường hợp.

+1

Argh, 11 phút quá chậm! Đây là những gì tôi nhận được để trả lời các câu hỏi từ iPhone của mình. Câu trả lời tốt đầu tiên. :) – rickster

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