Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当从Objective-C中的块内访问对象时,对象是否需要(a)``块'修饰符或(b)弱引用?_Ios_Objective C_Scope_Objective C Blocks - Fatal编程技术网

Ios 当从Objective-C中的块内访问对象时,对象是否需要(a)``块'修饰符或(b)弱引用?

Ios 当从Objective-C中的块内访问对象时,对象是否需要(a)``块'修饰符或(b)弱引用?,ios,objective-c,scope,objective-c-blocks,Ios,Objective C,Scope,Objective C Blocks,在Objective-C中(从Xcode 7开始),与原语一起使用的\u块修饰符在堆栈溢出中得到了明确的解释,例如Apple和。如果没有标签,将捕获图元的副本,并且无法从块内修改原始图元。有了标签,就没有副本,可以从块内修改原件 但是对于使用指向对象的指针,这种情况并没有得到很好的解释。苹果公司表示,要么“强烈引用自我”,要么“强烈引用变量”。但在页面的最后,苹果说: 要覆盖特定对象变量的此行为,可以使用_块存储类型修改器对其进行标记 “覆盖此行为”是什么意思 更复杂的是,堆栈溢出上的一些帖子谈

在Objective-C中(从Xcode 7开始),与原语一起使用的
\u块
修饰符在堆栈溢出中得到了明确的解释,例如Apple和。如果没有标签,将捕获图元的副本,并且无法从块内修改原始图元。有了标签,就没有副本,可以从块内修改原件

但是对于使用指向对象的指针,这种情况并没有得到很好的解释。苹果公司表示,要么“强烈引用自我”,要么“强烈引用变量”。但在页面的最后,苹果说:

要覆盖特定对象变量的此行为,可以使用_块存储类型修改器对其进行标记

“覆盖此行为”是什么意思

更复杂的是,堆栈溢出上的一些帖子谈到在从块内调用对象时进行弱引用

我不是在试图建立一个对象。我只想从块中修改现有对象的状态。我相信块是在同一个线程中被同步调用的

想象一下:

Clicker*myClicker=[[Clicker alloc]init];
…
//声明一个块。
无效(^myBlock)();
//填充块。
myBlock=^void(){
[myClicker click];//更新该对象中的某些状态,例如递增计数器编号或向集合中添加元素。
};
//从其他代码同步调用“myBlock”(同一线程)。
…/…重复调用“myBlock”…
我的问题是:

  • 如何使用
    \u块
    修改器修改该代码

  • 如何使用弱引用修改代码

  • 还有哪些问题适用于从块内修改的对象状态


    • 你引用了有点过时的说法,上面说:

      要覆盖特定对象变量的此行为,可以使用
      \u块
      存储类型修改器对其进行标记

      该文件可追溯到以前的手动参考计数。在手动引用计数代码中,您可以使用
      \uu块
      避免建立到块内引用对象的索引

      但如中所述,这种行为随着ARC而改变。现在,我们在不希望对块中引用的对象建立强引用的情况下使用
      。(在知道生成的悬空指针不是问题的特殊情况下,可以使用
      unsafe\u unretained
      。)


      因此,在处理要在块内变异的基本类型时,请继续使用
      \uu block
      。但是当处理ARC下块中的对象时,
      \u块
      限定符通常不会进入讨论。问题很简单,你想要的是一个强引用还是一个弱引用(或者是一个不安全的、未获得的引用)。这在很大程度上取决于你的应用程序的功能,即(a)你是否需要弱引用/未恢复引用来防止强引用循环;或者(b)您不希望某个异步执行的块不必要地延长该块中引用的某个对象的寿命。这两种情况在这里都不会出现。

      首先,
      \u block
      的基本点对于所有类型的变量(基本变量、对象指针变量和所有其他变量)都是相同的-->code>\u block
      使变量在外部作用域和捕获它的块的作用域之间共享,以便在所有其他作用域中都可以看到一个作用域中变量的赋值(
      =

      因此,如果不使用
      \uu block
      ,如果在创建块后将对象指针变量指定给块外的另一个对象,则块将看不到变量的指定,并且仍然会看到它指向创建块时指向的对象。相反,在块内部,您将无法指定给变量。如果确实使用了
      \u block
      ,则对变量的赋值将指向块内或块外的另一个对象,并将反映在其他范围中

      注意,对象状态的变化与变量赋值无关。可以通过对指向对象的指针调用mutating方法来改变对象的状态,也可以使用
      ->
      语法直接使用指向对象的指针来改变字段。这两种方法都不涉及将指针赋给一个变量。另一方面,赋值给持有指向某个对象的指针的变量只会使指针指向另一个对象;它不会变异任何对象

      您正在阅读的关于强引用和“重写此行为”的部分仅与MRC下块的内存管理行为的单独问题有关。在MRC下,没有像ARC中那样的变量是
      \uuuu strong
      \uuu弱
      的概念。当对象指针类型的变量被MRC中的块捕获时,默认情况下它被捕获为强引用(块保留它,并在块被释放时释放它),因为大多数时候这是所需的行为。如果希望块不保留捕获的变量,唯一的方法是使其
      \uu block
      ,这不仅使变量在两个作用域之间共享,而且使块不保留变量。因此,这两个概念在MRC中被合并了

      在ARC中,块是强捕获变量还是弱捕获变量取决于捕获的变量是
      \uuuu strong
      还是
      \uuu弱
      (或
      \uu不安全的
      ),并且与变量是否为
      \uu块
      完全正交。您可以拥有
      \uu block
      的对象指针变量,而无需弱captur