Objective-C 变量...指向它自己?

Posted

技术标签:

【中文标题】Objective-C 变量...指向它自己?【英文标题】:Objective-C variable... pointing to itself? 【发布时间】:2013-04-22 15:04:15 【问题描述】:

我在 Apple 处理键值观察的一些示例代码中发现了这种结构。添加观察者时,您可以添加可以唯一标识 KVO 调用的上下文(以 void* 变量的形式) - 如果您希望多个 KVO 调用触发相同的操作,则特别有用,因为单个上下文可以避免使用一堆链接或语句来检查所有的可能性。这是用于声明用于上下文的变量的行:

static void *aContext = &aContext;

它基本上是在声明 aContext 来引用自己,为自己分配自己的内存位置——这是一个为 KVO 上下文创建唯一标识符的绝妙技巧。抛开细节不谈,我很好奇这到底叫什么(自赋值?循环指针?别的什么?)以及它除了 KVO 之外还有什么其他用途。我尝试用谷歌搜索不同的东西,但由于缺乏正确的术语,我无法想出完全类似的东西。 :)

我肯定会经常使用这个技巧,因为它减少了 KVO 处理所需的 if 语句的数量,这使它更加优雅。

【问题讨论】:

我也喜欢这个技巧(感谢您指出),但说实话,它并不比 static char *aContext = "anything" ; 简单多少,它的工作原理相同。 ***.com/questions/2532102/… 根据***.com/a/2532108/834998,这在长度为 1 的循环列表中也可能有用。就我个人而言,我不会称其为惊人的技巧;只要您以相同的方式创建所有其他唯一标识符,这只是获取对于应用程序的当前执行有效的唯一标识符的简单方法。 正如@Jonathan 所说,它是自我引用的。更多的讨论可以在cocoa dev list找到。 【参考方案1】:

我认为这过于复杂和令人困惑。如果您想为 KVO 提供一个唯一的上下文,只需声明它并使用指向它的指针:

static int kMyObjectPropertyObservationContext;

...

[object addObserver:self
         forKeyPath:@"myProperty"
            options:0
            context:&kMyObjectPropertyObservationContext];

【讨论】:

【参考方案2】:

我认为最准确的描述是“自引用指针”。

【讨论】:

以上是关于Objective-C 变量...指向它自己?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ARC 的 Objective-C 代表

objective-c 中如何在一个函数中调用自己类中的另外一个函数

[iOS开发]Objective-C对象模型

在文件名中保存带有斜线的文件-objective-c

关于Objective-c的指针

Swift 对象的安全内存