我开始将libexobjc(https://github.com/jspahrsummers/libextobjc)集成到我的iOS应用程序中,主要是为了利用EXTScope的@strongify
和@weakify
,但在深入讨论这个过程之前,我有几个问题.
下面是一个故意过于复杂的例子,试图找出如何处理这个问题:
- (void)someMethod {
if (self.someBOOL) {
_someObjectInstanceVar = [Object objectWithCompletionHandler:^{
// self reference #1
if (self.someProperty) {
// self reference #2
[[Async HTTPRequest] sendAWithID:self.property.id completionHandler:^(void (^)(NewObject *newObject) {
// self reference #3
[self showViewWithObject:newObject handler:^{
// self reference #4
[self reloadData];
}];
}];
}
}];
else {
[[Async HTTPRequest] sendBWithID:self.property.id completionHandler:^{
// self reference #5
[self reloadData];
}];
}
}
我的理解是,如果我想做任何事情,比如异步HTTP请求,并且在完成处理程序引用self中,比如[self reloadData]
,我不需要使用strong/weak做任何事情,因为请求块本身没有保留完成块,所以保留循环没有问题.在上面的代码示例中,我认为#5是一种不存在保留周期问题的情况.
主要关注的是将块作为属性/init参数的所有对象,这些对象在内部保留块属性.在objectWithCompletionHandler
方法中,someObject
将completionHandler块作为一个实例变量保存,我知道有多个对self-there的引用会导致泄漏.我的主要问题是,在这种情况下,您需要如何处理weakify
和strongify
以使其"更安全"?一个@weakify和@strongify调用是否足够,如下所示:
- (void)someMethod {
@weakify (self);
_someObjectInstanceVar = [Object objectWithCompletionHandler:^{
@strongify(self);
...
}
上述@strongify(self)
个引用是否足以用于自引用#1、2、3和4,或者我是否必须(甚至可以)获得一个新的弱/强引用以在sendAWithID
方法和嵌套reloadData
中使用?
编辑:修复了让问题更有意义的代码,并修复了一些语法错误.