【问题标题】:Does @property(retain) need a release?@property(retain) 是否需要发布?
【发布时间】:2010-12-19 11:12:42
【问题描述】:

下面是三个代码片段,前两个是两个对象的接口以及几个@property 命令。请注意,这只是我在学习,它不是应用程序的一部分,只是一个小测试程序。

在向第二个@property 添加(保留)后,我注意到我的机器对象在我的程序退出时泄漏,我要解决这个问题是在 Artist 对象中添加一个释放,这听起来对吗?

@interface Machine : NSObject
{
    NSString *name;
    NSString *type;
    NSString *os;
}

@interface Artist : NSObject
{
    NSString *name;
    Machine *system;
}
@property(copy) NSString *name;
@property(retain) Machine *system;
@end

// DEALLOC IN @implementation Artist
-(void)dealloc {
    NSLog(@"_deal: %@", self);
    [system release];
    [super dealloc];
}

加里

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    如果您的目标是 Mac OS X,最好的答案是打开垃圾收集并删除 -dealloc 方法。

    要回答具体问题,您需要在 -dealloc 方法中同时 release 和 name 和 system。

    【讨论】:

    • 顾名思义,dealloc 中的“释放”就是释放在@property(copy) 中制作的副本。
    • 完全正确; (copy) 和 (retain) 属性暗示了一个 -retain 在集合上,它需要通过 -dealloc 中的 -release 来平衡。
    【解决方案2】:

    每次调用retain或alloc方法时都必须手动调用release。

    【讨论】:

    • 谢谢,我知道 "alloc" "new" "copy" 并保留您有责任放弃对象的所有权。我只是不确定在这种情况下保留是否遵循相同的规则,显然它确实如此。
    【解决方案3】:

    是的,通过将其设置为 nil 或根据操作系统调用 release。

    【讨论】:

    • 你的意思是“取决于 GC 是否开启”。您可以在任一操作系统上关闭 GC(因此需要释放它)。
    猜你喜欢
    • 2011-06-02
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    相关资源
    最近更新 更多