【问题标题】:How to release attribute which is protocol?如何释放协议属性?
【发布时间】:2009-11-26 10:56:58
【问题描述】:

我为 iPhone 开发工作了一段时间。第一次,我对 Objective-c 中的内存管理感到非常惊讶 :)。但现在我明白了一点。

问题是,有时我将协议用作类的属性,因为我认为它的定义与 C# 或 Java 中的“接口”非常相似。如下所示。

@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];
 }

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

【问题讨论】:

  • iKenndac 下面的回答是正确的方法。或者,您可以将 ID 转换为符合 NSObject 协议的 ID 并调用 release 方法。 [(id&lt;NSObject)shield release] 或 NSObject [(NSObject*)shield release]

标签: iphone objective-c protocols


【解决方案1】:

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

@protocol Shield <NSObject>
   ...
@end

知道怎么做就简单了! ;-)

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

另一个编辑:这样做可能会让您觉得奇怪,但 Objective-C 允许多个根对象,因此您实际上不能保证每个对象都来自 NSObject。由于releaseNSObject 方法,因此您必须将协议定义为也遵守&lt;NSObject&gt; 协议,然后才能确定它能够响应release 方法。

【讨论】:

    【解决方案2】:

    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 并因此摆脱它 在交易中。

    Why are Objective-C delegates usually given the property assign instead of retain?

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

    @property(nonatomic, assign) id 委托

    【讨论】:

    • 直接释放会员没有错。并更改属性属性以分配给您内存泄漏(如果保留屏蔽)或运行时错误(如果您只是分配屏蔽自动释放的对象)
    • hmm 所以每当有人使用 uitableviews 时,他们都会在运行时出错。我现在明白了。请看developer.apple.com/iphone/library/documentation/UIKit/…
    • 好吧,抱歉,我在原始问题中没有看到任何关于代表的信息。不知道属性的实际用途就很难谈论属性
    • 委托是用于如下结构的象征性通用名称:@protocol Shield ... @end OP 试图释放其委托(即盾牌),由于上述原因,它只是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2015-03-12
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多