Как использовать @encode () для получения @ "NSArray" в Objective-C - PullRequest
0 голосов
/ 24 апреля 2009

Я использую функции времени выполнения, чтобы получить тип свойства (спасибо eJames за помощь в выяснении этого способа). Строка атрибута свойства выглядит следующим образом:

T @ "NSArray", &, Vstuff

Мне нужно проверить, является ли тип свойства массивом, на данный момент я делаю это так:

 - (BOOL)valueForKeyIsArray:(NSString *)key fromTagret:(id)target
{
    NSString *lowerCaseKey = [self convertToKVCKey:key];

    objc_property_t property = class_getProperty([target class], [lowerCaseKey UTF8String]);
    NSString *propertyAttrs = [NSString stringWithUTF8String:property_getAttributes(property)];
    NSString *encodedType = @"@\"NSArray\"";

    NSRange range = [propertyAttrs rangeOfString:encodedType options:NSLiteralSearch];
    return range.location != NSNotFound;
}

Но поскольку Apple может изменить строку определения типа в любое время, я хотел бы сгенерировать эту строку типа @ "NSArray". Я попробовал это с @encode (), но это не сработало:

NSString *encodedType = [NSString stringWithUTF8String:@encode(NSArray *)];

Так как я могу сгенерировать эту строку типа? Или есть лучший способ проверить, содержат ли атрибуты этого свойства тип массива?

Ответы [ 2 ]

4 голосов
/ 29 мая 2009

Нет способа проверить это. В исходном коде Objective C переменные, которые набираются как NSArray *, доступны только для того, чтобы компилятор выдавал предупреждения. Он не имеет смысла и не существует во время выполнения. Если вы неправильно набрали NSArray как NSString, вы получите много предупреждений при компиляции, но ваш код будет работать точно так же при запуске. Во время выполнения все, что известно, это то, что свойство ivar / является «объектом».

Еще один способ думать об этом: после компиляции Objective-C все ссылки на объекты становятся id ссылками.

0 голосов
/ 25 сентября 2010

Просто примите, что если время выполнения изменится, ваш код сломается и будет двигаться дальше. Тем не менее, я думаю, что вы можете неправильно классифицировать ивары типа NSMutableArray *, CFArrayRef или CFMutableArrayRef. Вы также, похоже, предполагаете, что все ключи соответствуют непосредственно объявленному свойству.

Самым чистым решением может быть утверждение, что образец объекта, используемого для теста (цель), должен иметь значение, отличное от нуля для этого ключа, и просто получить значение и проверить, что [[target valueForKey:key] isKindOfClass:[NSArray class]].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...