Хранение незарегистрированного класса в NSMutableDictionary - PullRequest
0 голосов
/ 07 февраля 2012

В моем коде я динамически создаю классы и пытаюсь сохранить их в NSMutableDictionary:

NSMutableDictionary* classDict = [ [ NSMutableDictionary alloc ] init ];  

...start loop

Class customClass = objc_allocateClassPair( [ TestClass class ], className, 0 );

[ classDict setObject:customClass forKey:name ]

...end loop

...add methods to certain classes within the dict

...register classes with objective c

Когда я запускаю код, выдается «EXC_BAD_ACCESS», когда он пытается добавить класс в словарь. Есть ли способ обойти это? То есть есть ли способ добавить незарегистрированный класс в NSMutableDictionary? Альтернативное решение - использовать вместо этого структуру данных std: map.

Заранее спасибо.

1 Ответ

4 голосов
/ 07 февраля 2012

Чтобы ответить на настоящий вопрос: добавить объект Class в словарь просто:

[dict setObject:[TestClass class] forKey:@"key"];

И я делаю это часто, без каких-либо проблем.Тем не менее, вы, кажется, хотите добавить незаконченный объект класса.В документации говорится:

Когда вы закончите сборку класса, вызовите objc_registerClassPair.Новый класс теперь готов к использованию.

Так, может быть, ваш Class объект еще не "готов к использованию"?

обновление после некоторых тестов:

вам нужно вызвать objc_registerClassPair, чтобы использовать Class в качестве фактического объекта.Вызов retain до этого времени приведет к EXC_BAD_ACCESS.

Если вы хотите создать классы в цикле и зарегистрировать их на более позднем этапе, просто отметьте указатели, используя:

[classDict setObject:[NSValue valueWithPointer:customClass] forKey:name];

просто распакуйте их, используя Class customClass = [value pointerValue];.После регистрации вы, конечно, можете использовать Class объекты как обычно.

...