2009-09-06 23 views
9
@protocol Eating 
@end 

@interface Eat : NSObject<Eating> 
{ 
} 
- (id<Eating> *)me; 
@end 

@implementation Eat 
- (id<Eating> *)me { return self; } 
@end 

Trong đoạn mã Objective-C ở trên, tại sao kết quả "tự trả lại" trong cảnh báo "Trở về từ loại con trỏ không tương thích"? Loại con trỏ không tương thích là gì và cách khắc phục?Nghị định thư mục tiêu-C Sự điên rồ - cách trả về đối tượng dựa trên giao thức?

+1

Sử dụng @protocol Eating - nó sẽ cho phép bạn sử dụng các phương pháp NSObject trên các đối tượng đó, thay vì chỉ các phương thức bạn yêu cầu. – Kornel

Trả lời

11

id là con trỏ, bạn không cần dấu sao.

@interface Eat : NSObject<Eating> { 
} 
- (id<Eating>)me; 
@end 
+1

Đó là dấu sao, không phải là Asterix: http://en.wikipedia.org/wiki/Asterix;) (đã cho tôi ba lần để nhận được bình luận này đúng!) – dreamlax

0

xóa id * và thay thế bằng id. id đã là một con trỏ.

1

Ok .. câu trả lời là "id" thay vì "id *".

+0

Bạn nên chấp nhận một trong những câu trả lời đã được trao cho bạn. –

+0

Tại sao lại là downvote? Ông đã đăng bài này như là một trong những đầu tiên bởi vì ông đã tìm ra vấn đề ra chính mình. –

0

Bạn hơi bị sai trong sử dụng của bạn - đó là:

- (id<Eating>)me { return self; } 

(bởi vì bạn đang trở về id, không phải là một con trỏ đến một đối tượng).

+0

Sự khác nhau giữa ** một con trỏ tới đối tượng ** và ** id ** là gì? –

+0

Trên thực tế không có gì - đó là lý do mã của bạn không hoạt động. (NSObject *) và (id) là loại đã giống nhau (không thực sự nhưng đủ gần cho cuộc thảo luận này) vì vậy khi bạn nói (id *) nó giống như nói (NSObject **). Có một chút kỳ lạ là id và Class là cả hai đối tượng mà bạn không sử dụng * ... –

1

id về bản chất là NSObject * (mặc dù có một số khác biệt nhỏ). Do đó, khi bạn trả lại self, bạn sẽ trả lại -(NSObject *). Những gì bạn có là id * giống như NSObject **.

+2

'id' là một typedef cho' struct objc_object * ', không phải' NSObject * '. Sự khác biệt là đáng kể. – dreamlax

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