Pab*_*blo 5 objective-c objective-c-blocks
在下面的示例中,我不明白为什么localVariable要通过值访问doSomethingWithObject.是什么促成了转换?您如何区分按值访问变量和通过引用访问变量?如果可能的话,我想看到更多相关的例子.
以下是Apple的Blocks Programming Topics的摘录,并展示了如何在块中保留实例变量.
如果在方法的实现中使用块,则对象实例变量的内存管理规则更加微妙:
- 如果通过引用访问实例变量,
self则保留;- 如果按值访问实例变量,则保留变量.
以下示例说明了两种不同的情况:
Run Code Online (Sandbox Code Playgroud)dispatch_async(queue, ^{ // instanceVariable is used by reference, self is retained doSomethingWithObject(instanceVariable); }); id localVariable = instanceVariable; dispatch_async(queue, ^{ // localVariable is used by value, localVariable is retained (not self) doSomethingWithObject(localVariable); });
Dav*_*ong 12
这是因为当您直接访问实例变量时,编译器(或多或少)会将其转换为结构成员查找.所以:
[ivar doSomething];
Run Code Online (Sandbox Code Playgroud)
变
[self->ivar doSomething];
Run Code Online (Sandbox Code Playgroud)
因为self需要,self必须保留.但是,当您将指针值复制到新变量中时,您知道更长时间需要self结构知道指针值是什么,因此self不需要保留,因为指针值可以const从堆栈中复制.实例变量不会发生这种情况(因为ivar可能会在创建块和执行块之间发生变化).
澄清:
self),以便查找始终成功.如果它没有这样做,那么self将来可能会被解除分配,现在结构查找会导致访问不当(很可能),你的应用程序会崩溃.self,因为self不再涉及检索相关对象的地址| 归档时间: |
|
| 查看次数: |
1110 次 |
| 最近记录: |