hod*_*smr 8 objective-c ios automatic-ref-counting
假设我正在尝试self从块内访问:
[someObject successBlock:^(NSArray *result) {
[self someSuccessMethod];
} failure:^(NSString *errorMessage, int status) {
[self someFailureMethod];
}];
Run Code Online (Sandbox Code Playgroud)
我知道这会创建一个保留周期,someObject并且self永远不会被取消分配.
令我感到困惑的是,有/没有__block关键字的实际情况.我可以通过__weak引用self 来修复保留周期:
__weak MyClass* me = self;
[someObject successBlock:^(NSArray *result) {
[me someSuccessMethod];
} failure:^(NSString *errorMessage, int status) {
[me someFailureMethod];
}];
Run Code Online (Sandbox Code Playgroud)
我不需要在__block这里使用,因为我不是想me在块内修改.根据我的理解,如果我不使用__block,me则在块内引用副本.我的问题是:如果块中引用的内容只是对象的副本,为什么原始代码块会创建保留周期?我猜这个引用self只是一个副本,因为我从不使用__block关键字.我错误地想到了这个吗?
在第一种情况下,块捕获self,即它保存self另一个强指针的副本.这会增加指向对象的保留计数,并导致保留周期.
在第二种情况下,块捕获me,即它保存me另一个弱
指针的副本.这不会增加保留计数,因此不会导致保留周期.
(如果打印块的外部和内部地址me,您将看到地址不同.块具有自己的指向对象的弱指针.)
如果指定的对象被释放,则所有弱引用(包括块保存的引用)都由nilObjective-C运行时设置.
(我只希望我做对了.)
| 归档时间: |
|
| 查看次数: |
5294 次 |
| 最近记录: |