2013-06-24 3 views
2

Мне нужно уметь различать объективные c встроенных классов и классы приложений. То, как я делаю это определение прямо сейчас, проверяет, начинается ли название класса с «__», что является ужасным и взломанным решением, но оно работает.Objective C Runtime - Встроенные классы и пользовательские классы?

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

//a variable named object is defined already 

unsigned int outCount, i; 
objc_property_t *properties = class_copyPropertyList([object class], &outCount); 

for (i = 0; i < outCount; i++) 
{ 
    objc_property_t property = properties[i]; 
    NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)]; 
    id propertyValue = [object valueForKey:(NSString *)propertyName]; 

    NSString *classString = NSStringFromClass([propertyValue class]); 

    if ((classString.length > 2 && [[classString substringToIndex:2] isEqual:@"__"])) 
    { 
     // Objective C Class (NSString, NSArray, NSDate, NSNumber) 
    } 
    else 
    { 
     // Not Objetive C Class 
    } 
} 
+7

** Почему? ** Зачем вам это нужно? Есть так много способов, что это плохая идея. – bbum

+0

@bbum Я пишу объект для сопоставления словаря. Если Object является сложным объектом, мне нужно, чтобы он думал о свойствах и создавал ключ/значения. Если нет, мне нужно разобрать значение непосредственно в словаре. Источник здесь, и в коде есть предупреждение, связанное с частью, опубликованной здесь в строке 87. https://github.com/aryaxt/OCMapper/blob/master/OCMapper/Source/ObjectMapper.m – aryaxt

+3

Аккуратный материал (На самом деле - очень круто - я был довольно глубоко в динамичной кроличьей дыре, и это вызывает интерес!), Академически, но действительно ли вам нужен этот уровень динамизма? Если это академическое преследование, погрузитесь! В противном случае? Вам действительно нужна абстракция, чтобы ваше приложение быстро и эффективно работало? – bbum

ответ

7

Я не на 100% понят, что вы подразумеваете под «встроенными классами». Являются ли классы в рамках Фонда «встроенными»? Как насчет занятий в UIKit? QuartzCore? AVFoundation? Социальное?

Кроме того, попытка отличить подобные классы кажется плохой идеей, если только она не предназначена для изучения системы.

Сказанное, возможно, этого будет достаточно, чтобы получить пакет, из которого был загружен класс. Это скажет вам, был ли класс загружен из фонда, или UIKit и т. Д. Посмотрите на +[NSBundle bundleForClass:].

+0

Построенный я имею в виду классы какао, все, что не было создано вами. Спасибо за ответ, попробуем протестировать против budle и вернуться назад. – aryaxt

+0

Я попытался, если ([NSBundle bundleForClass: [Пользовательский класс]] == [NSBundle mainBundle]). Я тестировал его с классом «Пользователь» и «NSDate», и он отлично работает. Для класса «Пользователь» он возвращает true, а для класса NSDate он возвращает false. Можете ли вы придумать любой случай, когда эта логика не сработает? Если нет, я думаю, что это идеальное решение, я попробую. Спасибо – aryaxt

+0

Я полагаю, что это может не сработать над классом, созданным во время выполнения, с помощью 'objc_allocateClassPair' или [класса, созданного KVO] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/ Статьи/KVOImplementation.html # // apple_ref/DOC/UID/20002307-BAJEAIEE). Вам придется самим протестировать их, если вы считаете, что это будет проблемой. Вы, вероятно, не столкнетесь с ними, хотя. –

Смежные вопросы