如何发布协议的属性?

时间:2009-11-26 10:56:59

标签: iphone objective-c protocols

我已经为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];
 }

如您所见,我无法发布协议。这会导致我未来的内存问题吗?你有其他办法处理这个解决方案给我建议吗?

2 个答案:

答案 0 :(得分:8)

您需要将协议定义为遵守NSObject协议,如下所示:

@protocol Shield <NSObject>
   ...
@end

当你知道怎么做时,这很简单! ; - )

编辑:另外,你是对的 - Objective-C中的协议等同于Java和C#中的接口。

另一个编辑:它可能会让你感到奇怪,但是Objective-C允许多个根对象,所以你无法保证每个对象都会从NSObject下降。由于releaseNSObject方法,因此您必须先将协议定义为遵守<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;代表