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

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

有帮助吗?

解决方案

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

@protocol Shield <NSObject>
   ...
@end

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

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

另一个编辑:它可能会让你感到奇怪,但是Objective-C允许多个根对象,所以你实际上无法保证每个对象都会从release下降。由于<NSObject>是<=>方法,因此您必须先将协议定义为遵守<=>协议,然后才能确定它是否能够响应<=>方法。

其他提示

1 - 正确的做法是设置

而不是[盾牌释放]
self.shield = nil;

2 - 也改变

@property (nonatomic,retain) id<Shield> shield; 

@property (nonatomic,assign) id<Shield> shield;

然后你很好。

编辑:

  

你避免保留的原因   代表们,你需要避免一个   保留循环:

     

A创建B A将自己设置为B   代表<!>#8230; A由其所有者发布

     

如果B保留A,则A不会   释放,因为B拥有A,因此是A的   dealloc永远不会被调用,   导致A和B泄漏。

     

你不应该担心A会消失   b / c它拥有B并因此摆脱它   在dealloc。

为什么是目标-C代表通常给予财产分配而不是保留?

请参阅uitableview类参考以获取示例协议声明:

@property(nonatomic,assign)id <!> lt; <!>的UITableViewDelegate GT;代表

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top