Я пытаюсь изменить класс объектов, созданных с помощью пера, с помощью iPhone SDK.
Причиной этого является; я не знаю до времени выполнения, что это за класс, который я хочу, чтобы объект nib был (хотя они будут иметь один и тот же суперкласс на основе UIView), и я не хочу создавать разные nib для каждой возможности - так как .nib будет то же самое для каждого, кроме класса одного объекта.
Я добился успеха, применив несколько методов, но либо столкнулся с некоторыми эффектами, либо не уверен в том, насколько безопасны использованные мной методы:
Метод 1: Переопределить alloc для суперкласса и установите переменную c для класса, который мне требуется:
+ (id) alloc {
if (theClassIWant) {
id object = [theClassIWant allocWithZone:NSDefaultMallocZone()];
theClassIWant = nil;
return object;
}
return [BaseClass allocWithZone:NSDefaultMallocZone()];
}
это работает хорошо, и я предполагаю, что это «достаточно» безопасно, хотя, если есть перо с правильным классом в качестве идентификатора класса в перо, или я сам выделяю подкласс (без установки «theClassIWant») - объект базовый класс создан. Мне также не очень нравится идея переопределения alloc ...
Метод 2: использовать object_setClass (self, theClassIWant) в initWithCoder (перед вызовом initWithCoder для суперкласса):
- (id) initWithCoder:(NSCoder *)aDecoder {
if (theClassIWant) {
// the framework doesn't like this:
//[self release];
//self = [theClassIWant alloc];
// whoa now!
object_setClass(self,theClassIWant);
theClassIWant = nil;
return [self initWithCoder:aDecoder];
}
if (self = [super initWithCoder:aDecoder]) {
...
это также хорошо работает, но не все подклассы обязательно будут того же размера, что и суперкласс, так что это может быть очень небезопасно! Чтобы бороться с этим, я попытался выпустить и повторно назначить правильный тип в initWithCoder, но я получил следующую ошибку из фреймворка:
"Этот кодер требует, чтобы замененные объекты возвращались из initWithCoder:"
не совсем понимаю, что это значит! я заменяю объект в initWithCoder ...
Любые комментарии о валидности этих методов, предложения по улучшению или альтернативы приветствуются!