Objective-C 属性和内存管理

标签 objective-c properties

给定以下属性定义:

@property (nonatomic,retain) MyObject* foo;

下面的代码是否会导致内存泄漏:

self.foo = [[MyObject alloc] init];

?

看起来 alloc 调用将对象的保留计数递增到 1,然后属性 setter 中的 retain 将其递增到 1。但是由于初始计数永远不会递减到 0,即使在 self被释放。该分析是否正确?

如果是这样,看来我有两个选择:

self.foo = [[[MyObject alloc] init] autorelease];

出于性能原因,不推荐在 iPhone 上使用,或者:

MyObject* x = [[MyObject alloc] init];
self.foo = x
[x release];

这有点麻烦。还有其他选择吗?

最佳答案

Are there any alternatives?

没有。

如果不使用自动释放,您将无法编写大部分 iPhone 应用程序,而 Cocoa Touch 库在许多地方都使用它们。了解它在做什么(将指针添加到列表以在下一帧删除)并避​​免在紧密循环中使用它。

您可以在 MyObject 上使用类方法为您执行 alloc/init/autorelease 来清理它。

+ (MyObject *)object {
    return [[[MyObject alloc] init] autorelease];
}

self.foo = [MyObject object];

关于Objective-C 属性和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292880/

相关文章:

spring - 库 jar 可以从 Spring Cloud Config Server 读取属性吗?

java - 从 .txt 文件中的学生列表计算平均值

java - 如何根据映射中相似的键值前缀构建对象

ios - 在屏幕中间居中 CAShapeLayer 圆圈

javascript - UIWebView 和 JavaScript

ios - 使用 GTMOAuth2ViewControllerTouch 进​​行身份验证时执行 moments.insert

iphone - UIImageView inArray 属性?

ios - Restkit 从核心数据中删除项目

logging - Spring Boot 关闭包的日志记录

java - 在 Wicket 中使用参数化 UI 消息的简单方法?