Objective-C переменная... указывая на себя?
Я заметил эту конструкцию в некоторых примерах кода Apple для работы с наблюдением за ключевыми значениями. При добавлении наблюдателя вы можете добавить контекст (в виде переменной void *), который может однозначно идентифицировать вызов KVO - особенно полезно, если вы хотите, чтобы несколько вызовов KVO вызывали одно и то же действие, так как в одном контексте можно избежать использования кучу прикованных или заявлений, чтобы проверить все возможности. Это строка, используемая для объявления переменной, используемой для контекста:
static void *aContext = &aContext;
В основном он объявляет, что aContext ссылается на себя, присваивая себе собственную ячейку памяти - блестящий трюк, который создает уникальный идентификатор для контекста KVO. В отличие от этого, мне любопытно, что именно это называется (самоназвание - круговой указатель? Что-то еще?), А также то, что он может использовать помимо KVO. Я пробовал разные вещи в Google, но я не мог придумать ничего подобного, не имея надлежащей терминологии.:)
Я буду регулярно использовать этот трюк, поскольку он уменьшает количество операторов if, необходимых для обработки KVO, что делает его намного более элегантным.
Ответы
Ответ 1
Я думаю, что это слишком сложно и запутанно. Если вы хотите иметь уникальный контекст для KVO, просто объявите его и используйте указатель на него:
static int kMyObjectPropertyObservationContext;
...
[object addObserver:self
forKeyPath:@"myProperty"
options:0
context:&kMyObjectPropertyObservationContext];
Ответ 2
Я думаю, что наиболее точное описание будет "самореференциальным указателем".