Цель C создать объект по классу - PullRequest
7 голосов
/ 07 сентября 2010

Я хотел бы знать, как создать объект указанной Class в цели c.Есть ли какой-то метод, который мне не хватает в документации по времени выполнения?Если так, то, что это?Я хотел бы иметь возможность сделать что-то вроде следующего:

NSDictionary *types;

-(id<AProtocol>) createInstance:(NSString *) name
{
    if ((Class cls = [types objectForKey:name]) != nil)
    {
       return new Instance of cls;
    }
    else
    {
        [NSException raise:@"class not found" format:@"The specified class (%@) was not found.", name];
    }
}

обратите внимание, что имя это не имя класса, а сокращение для него, и я не могу сделать то, что указано в Создать объект из NSString имени класса в Objective-C .

Ответы [ 2 ]

18 голосов
/ 07 сентября 2010

Простой [[cls alloc] init] сделает свое дело.

3 голосов
/ 07 сентября 2010

Как уже упоминал Коббал [[cls alloc] init] - обычная практика. alloc - это метод статического класса, определенный в NSObject, который выделяет память, а init является конструктором экземпляра. Многие классы предоставляют удобные конструкторы, которые делают это за один шаг. Пример:

NSString* str = [NSString stringWithString:@"Blah..."];

Обратите внимание на * после NSString. Вы работаете по существу с C здесь, так что указатели на объекты!

Также не забудьте освободить память, выделенную с помощью alloc с соответствующим [instance release]. Вам не нужно освобождать память, созданную с помощью удобного конструктора, поскольку она автоматически освобождается для вас. Когда вы возвращаете свой новый экземпляр cls, вы должны добавить его в пул автоматического выпуска, чтобы не допустить утечки памяти:

return [[[cls alloc] init] autorelease];

Надеюсь, это поможет.

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