【发布时间】:2013-02-12 07:52:34
【问题描述】:
我对内存管理/保留周期有点困惑。这是一个简单的类:
@interface Test : NSObject {
NSObject *objectA;
}
@property (nonatomic, strong) NSObject *objectB;
- (void)methodA;
@end
假设我有一个 Test 实例拥有的块。在这块我做:
objectA = nil;
我得到一个编译器,说它正在这个块中捕获自我,这将导致保留周期。为什么?我在这里看不到自己。
如果我这样做:
self.objectB = nil;
没有警告!如果有的话,我应该在这里收到警告。
如果我这样做:
[self methodA];
我在这里得到一个警告。所以我不确定幕后到底发生了什么。我希望第一个不给我警告,最后两个给我一个警告(因为我保留了一个指向自我的强指针),但实际上恰恰相反。
这是一个例子:
@interface ListVC () {
NSObject *objectA;
}
@property (nonatomic, strong) NSObject *objectB;
- (void)methodA;
@end
在 viewDidLoad 中:
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView addPullToRefreshWithActionHandler:^{
self.objectB = nil; //no warning here
objectA = nil; //warning here
[self methodA]; //warning here (if i place this above previous warning
}];
}
【问题讨论】:
-
你的 .h 是这样的吗?
@interface Test ()因为它看起来像一个类别。 -
@JackyBoy 这只是我快速编写的一个示例。我没有 .h 或 .m,我在 SO 编辑器上写道。
-
好吧,我们需要检查所有内容以查看问题所在。我刚刚尝试了我的代码,在一个块内将 ivar 设置为 nil,一切都按预期进行。没有警告。有代码示例吗?
-
第一个(与任何 ivar 访问一样)隐式为
self->objectB;在这种情况下,块保留self,而不是 ivar 中的对象。为什么第二个没有警告我不知道;它应该,因为它相当于第三个。 -
@JackyBoy 检查更新示例
标签: ios objective-c cocoa-touch