and*_*der 23 iphone objective-c ios objective-c-blocks automatic-ref-counting
是否有可能在没有__weak对象的块中传递[self anyFunction]?
作为示例,这是来自System Framework的有效代码:
[UIView animateWithDuration:0.8 animations:^{
//Do animationStuff
} completion:^(BOOL finished) {
[self anyFunction];
}];
Run Code Online (Sandbox Code Playgroud)
您可以[self anyFunction]在没有警告的情况下传入完成块.但是如果使用完成块编写自己的方法,则会出现以下警告:在此块中强烈捕获"self"可能会导致保留周期.
工作解决方案非常简单(iOS 5 + ARC).在块声明之前:
__weak MyClass *weakSelf = self;
Run Code Online (Sandbox Code Playgroud)
在完成块中你必须打电话:
[weakSelf anyFunction];
Run Code Online (Sandbox Code Playgroud)
但是,回到我的问题:为什么System Framework API中不需要使用__weak对象并在self没有任何警告的情况下使用.以及如何__weak在块中不需要对象的情况下实现方法?
感谢你的付出.
Abi*_*ern 53
抛出错误的块是捕获拥有块的对象的块.例如
[object performBlock:^{
[object performSomeAction]; // Will raise a warning
}];
Run Code Online (Sandbox Code Playgroud)
要么
[self performBlock:^{
[self doSomething]; // Will raise a warning
}];
Run Code Online (Sandbox Code Playgroud)
但
[self performBlock:^{
[object doSomething]; // <-- No problem here
}];
Run Code Online (Sandbox Code Playgroud)
因为一个对象保留了它的块,一个块保留了它的对象.因此,在这两种情况下,执行块的对象拥有块,该块也拥有该对象.所以你有一个循环 - 一个保留周期.这意味着内存泄露.
在您给出的示例中 - 您正在查看类方法.你在UIView类上调用块,而不是UIView对象.类没有与之关联的内存.你可能正在从一个控制器调用这个函数,所以self该块保留了引用,但是没有循环,因为self没有保留块.
就像你可能注意到的那样,并非所有在块中使用的对象都需要被弱引用 - 只是导致保留周期的对象.
Gre*_*mbs 14
对于我需要使用或不使用ARC进行编译的代码,或者使用或不使用较新的编译器,我执行以下操作...在功能上它与您已经列出的相同,但它避免了_weak并且也避免了保留释放周期:
//
// FOR NON-ARC PROJECTS
//
__block __typeof__(self) bself = self;
[someObject doThingWithBlock:^(id result){
if (!bself)
return;
bself.thingWhich = result;
}];
///
// FOR ARC PROJECTS
//
__weak MyClass *bself = self;
[someObject doThingWithBlock:^(id result){
if (!bself)
return;
bself.thingWhich = result;
}];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10619 次 |
| 最近记录: |