代码之家  ›  专栏  ›  技术社区  ›  Nick Hingston

更改用loadnibnamed实例化的类

  •  3
  • Nick Hingston  · 技术社区  · 15 年前

    我正在尝试用iPhoneSDK更改用NIB创建的对象类。

    这样做的原因是:直到运行时我才知道类是什么,我希望NIB对象是(尽管它们将有相同的基于uiview的超级类),我不想为每个可能的事件创建不同的NIB,.NIB将是相同的每个,除了一个对象的类。

    我已经通过几种方法取得了成功,但要么有一些连锁反应,要么不确定我使用的方法有多安全:

    方法1:重写父类上的alloc,并将C变量设置为I所需的类:

    + (id) alloc {
     if (theClassIWant) {
      id object = [theClassIWant allocWithZone:NSDefaultMallocZone()]; 
      theClassIWant = nil;
      return object;
     }
     return [BaseClass allocWithZone:NSDefaultMallocZone()];
    }
    

    这很好地工作,而且我假设是“合理地”安全的,尽管如果在NIB中有一个具有正确类标识的NIB,或者我自己分配了一个子类(不设置“theClassiWant”)——创建了一个基类的对象。我也不喜欢覆盖alloc的想法…

    方法2:在initwitcoder中(在对超级类调用initwitcoder之前)使用object_setclass(self,theclasssiwant):

    - (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]) {
               ...
    
    • 这也很有效,但并不是所有的子类都必须与超级类大小相同,所以这可能是非常不安全的!为了解决这个问题,我尝试释放并重新分配到initwitcoder中的正确类型,但从框架中得到了以下错误:

      “此编码器要求从initwithcoder返回替换的对象:”

    不要完全明白这意味着什么!我正在用编码器替换init中的对象…

    欢迎对这些方法的有效性提出任何意见,或提出改进建议或替代方案!

    1 回复  |  直到 15 年前
        1
  •  0
  •   cduhn    15 年前

    虽然我很想知道你是否可以用你的方法来实现这一点,但你可能想考虑使用 custom placeholder objects .