Существует ли способ динамично определить ivars класса во времени выполнения в Какао / Касание Какао?

Я не знаю, квалифицирует ли это, как неправильно понято - но для меня, просто неизвестный.

я был рад узнать о DataLoadOptions и как я могу управлять, к каким таблицам присоединяются, когда я делаю особый запрос.

Посмотрите здесь для большего количества информации: MSDN: DataLoadOptions

6
задан Corey Floyd 27 October 2009 в 14:52
поделиться

3 ответа

Вам придется откатить свой собственный, используя Функции времени выполнения Objective-C . Вот очень простой пример кода. Обратите внимание, что получение ivars класса не приводит к получению ivars его суперкласса. Вам нужно будет сделать это явно, но все функции присутствуют во время выполнения.

#import <objc/objc-runtime.h>
#include <inttypes.h>
#include <Foundation/Foundation.h>

@interface Foo : NSObject
{
    int i1;
}
@end
@implementation Foo
@end

@interface Bar : Foo
{
    NSString* s1;
}

@end
@implementation Bar
@end

int main(int argc, char** argv)
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    unsigned int count;
    Ivar* ivars = class_copyIvarList([Bar class], &count);
    for(unsigned int i = 0; i < count; ++i)
    {
        NSLog(@"%@::%s", [Bar class], ivar_getName(ivars[i]));
    }
    free(ivars);


    [pool release];
}
8
ответ дан 8 December 2019 в 13:00
поделиться

Да, вполне возможно:

int numIvars = 0;
Ivar * ivars = class_copyIvarList([anInstanceOfAClass class], &numIvars);
NSMutableDictionary * pairs = [NSMutableDictionary dictionary];
for (int i = 0; i < numIvars; ++i) {
  Ivar ivar = ivars[i];
  NSString * ivarName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
  id ivarValue = [anInstanceOfAClass valueForKey:ivarName];
  [pairs setObject:ivarValue forKey:ivarName];
}
free(ivars);
NSLog(@"%@", pairs);
4
ответ дан 8 December 2019 в 13:00
поделиться

Я не уверен только в отношении ivars, но если они определены как свойства, это можно получить доступ к доступным свойствам класса.

Я использовал SQLitePersistentObjects для пары проектов, и у него есть полезный код, который получает свойства, определенные в классе, для использования при вычислении сериализации в sqlite и обратно.

] Он использует функцию class_copyPropertyList, чтобы получить список доступных свойств в классе.

Более конкретно:

6
ответ дан 8 December 2019 в 13:00
поделиться