我认为我对Objtovi-C的内存管理有很好的处理,但我想不出下面的情况:

@protocol MyProtocol
@end

@interface MyObject : NSObject {
    id<MyProtocol> reference;
}
@property (nonatomic, retain) id<MyProtocol> reference;
@end

@implementation MyObject
@synthesize reference;
-(void) dealloc {
    [reference release];
    [super dealloc];
}
...
@end

这给了我一个警告:在协议中没有发现。
我能安全地忽略这个错误吗?还是我做错了什么?

最佳答案

是的,您可以安全地忽略此错误。声明为类型id<MyProtocol>的对象不能从NSObject继承(您不必使用cocoa库在objective-c中编程,甚至在cocoa中也有其他根类,如NSProxy)。由于retain(和releaseautorelease)是在NSObject中声明的,编译器无法知道声明为类型id<MyProtocol>的实例响应这些消息。为了解决这个问题,cocoa还定义了镜像NSObjectapi的NSObject协议。如果你宣布你的协议是

@protocol MyProtocol <NSObject>
@end

表示MyProtocol扩展了NSObject协议,您将被设置。

08-27 13:35