Изменение классов, созданных с помощью loadNibNamed - PullRequest
3 голосов
/ 04 мая 2010

Я пытаюсь изменить класс объектов, созданных с помощью пера, с помощью 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 ...

Любые комментарии о валидности этих методов, предложения по улучшению или альтернативы приветствуются!

1 Ответ

0 голосов
/ 04 мая 2010

Хотя мне любопытно посмотреть, сможете ли вы осуществить это, используя свой подход, вы можете рассмотреть возможность использования пользовательских заполнителей .

...