我认为我对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
(和release
,autorelease
)是在NSObject
中声明的,编译器无法知道声明为类型id<MyProtocol>
的实例响应这些消息。为了解决这个问题,cocoa还定义了镜像NSObject
api的NSObject
协议。如果你宣布你的协议是
@protocol MyProtocol <NSObject>
@end
表示
MyProtocol
扩展了NSObject
协议,您将被设置。