Можно ли использовать указатель без идентификатора в качестве значения в objc_SetAssociatedObject? - PullRequest
3 голосов
/ 14 мая 2011

Как следует из названия. Ничто не пойдет не так, если я сделаю это:

- (void) associateSelector:(SEL)value withPointer:(void*)key
{
    objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}

Есть ли веские основания для осторожности при использовании?

Ответы [ 2 ]

6 голосов
/ 14 мая 2011

Вы используете API способом, явно не поддерживаемым документом. Таким образом, вы не можете жаловаться, когда он сломается в следующем обновлении OS X / iOS. Это одна из причин быть осторожным.

В документации говорится, что OBJC_ASSOCIATION_ASIGN устанавливает слабую ссылку. Это означает нетривиальную вещь в ситуации сбора мусора, так что будьте осторожны.

Если есть способ сделать что-то официально поддерживаемым способом, я бы предпочел это. В вашем случае использование NSStringFromSelector немедленно сделает ваш код поддерживаемым.

3 голосов
/ 14 мая 2011

Это плохая идея.Как говорит Юджи, вы нарушаете API, как определено в документации.Если вы действительно хотите сохранить произвольные значения, поместите их в NSValue и сохраните как OBJC_ASSOCIATION_RETAIN_NONATOMIC.

- (void) associateSelector:(SEL)value withPointer:(void*)key {
    NSValue *nsvalue = [NSValue valueWithBytes:&value objcType:@encode(SEL)];
    objc_SetAssociatedObject(self, key, nsvalue, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
...