Принятый ответ уже понял его правильно, но я хотел бы добавить объяснение: смысл «ключа» состоит в том, чтобы получить уникальный (для процесса / программы) идентификатор, который не будет иметь случайных коллизий.
Представьте, что ключ объявлен как NSUInteger
: многие люди будут использовать стандартные значения, такие как 0
, 1
или 42
. Особенно, если вы используете какую-то библиотеку или фреймворк, вероятны коллизии.
Поэтому вместо этого у некоторых умных инженеров Apple возникла идея объявить ключ указателем с намерением объявить переменную и передать указатель на эту переменную в качестве ключа. Компоновщик назначит этой переменной уникальный адрес в вашем приложении, поэтому вы гарантированно получите уникальное значение без столкновений.
Фактически, вы можете передать любое значение, которое вам нравится, указатель не разыменовывается (я это проверял). Таким образом, передача (void *)0
или (void *)42
в качестве ключа работает, хотя это не очень хорошая идея (поэтому, пожалуйста, не делайте этого). Для objc_set/getAssociatedObject
все, что имеет значение, это то, что значение, переданное в качестве ключа, является уникальным в вашем процессе / программе.