我已经为iPhone开发工作了一段时间。第一次,我对objective-c中的内存管理感到惊讶。但现在我得到了一点。
问题是,有时候,我使用protocol作为类的属性,因为我认为它的定义与C#或Java中的'interface'非常相似。如下。
@protocol Shield
...
@end
// Interface
@interface Dragon {
id<Shield> shield
NSString * name;
}
@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;
@end
但我总是在dealloc()方法中释放任何属性对象。如下。
-(void)dealloc {
[name release];
[shield release]; // <--- Totally impossible. xcode said '-release not found in protocol'
[super dealloc];
}
如您所见,我无法发布协议。这会导致我未来的内存问题吗?你有其他办法处理这个解决方案给我建议吗?
答案 0 :(得分:8)
您需要将协议定义为遵守NSObject
协议,如下所示:
@protocol Shield <NSObject>
...
@end
当你知道怎么做时,这很简单! ; - )
编辑:另外,你是对的 - Objective-C中的协议等同于Java和C#中的接口。
另一个编辑:它可能会让你感到奇怪,但是Objective-C允许多个根对象,所以你无法保证每个对象都会从NSObject
下降。由于release
是NSObject
方法,因此您必须先将协议定义为遵守<NSObject>
协议,然后才能确定它能够响应release
} 方法。
答案 1 :(得分:1)
1 - 正确的做法是设置
而不是[盾牌释放]self.shield = nil;
2 - 也改变
@property (nonatomic,retain) id<Shield> shield;
到
@property (nonatomic,assign) id<Shield> shield;
然后你很好。
编辑:
你避免保留的原因 代表们,你需要避免一个 保留循环:
A创建B A将自己设置为B 代表...... A由其所有者发布
如果B保留A,则A不会 释放,因为B拥有A,因此是A的 dealloc永远不会被调用, 导致A和B泄漏。
你不应该担心A会消失 b / c它拥有B并因此摆脱它 在dealloc。
Why are Objective-C delegates usually given the property assign instead of retain?
请参阅uitableview类参考以获取示例协议声明:
@property(nonatomic,assign)id&lt;的UITableViewDelegate&GT;代表