Objective-C变量...指向自身?

16

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

static void *aContext = &aContext;

这基本上是在声明一个 aContext 来引用自身,将其自己的内存位置赋值给自己 - 这是一个聪明的技巧,可以为 KVO 上下文创建一个唯一标识符。具体细节先不管,我想知道这到底叫什么(自赋值?循环指针?还是其他什么?),以及除了 KVO 之外是否还有其他用途。我尝试过谷歌搜索不同的东西,但因缺乏正确的术语而无法找到类似的内容。 :)

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


我也喜欢这个技巧(感谢你指出来),但实话实说,它并没有比static char *aContext = "anything" ;简单多少,两者的作用方式是相同的。 - Monolo
https://dev59.com/iHE85IYBdhLWcg3w8IbK - Greg
2
根据https://dev59.com/iHE85IYBdhLWcg3w8IbK#2532108的说法,这在长度为1的循环列表中也可能有用。就个人而言,我不会称之为惊人的技巧;它只是一种简单的方法来获取一个唯一标识符,该标识符对于应用程序的*当前执行*有效,前提是您以相同的方式创建所有其他唯一标识符。 - Greg
1
正如@Jonathan所说,这是自我引用的。可以在cocoa dev list中找到更多讨论。 - Bob Cromwell
2个回答

2

我认为这太过复杂和混乱了。当你想要为KVO声明一个独特的上下文时,只需声明并使用指向它的指针:

static int kMyObjectPropertyObservationContext;

...

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

1
我认为最准确的描述应该是“自指针”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接