Iphone 更改使用loadNibNamed实例化的类

Iphone 更改使用loadNibNamed实例化的类,iphone,objective-c,nib,Iphone,Objective C,Nib,我正试图用iphonesdk更改用nib创建的对象类 原因是,;直到运行时,我才知道我希望nib对象是什么类(尽管它们将具有相同的基于UIView的超类),并且我不希望为每种情况创建不同的nib-因为除了一个对象的类之外,每个.nib都将是相同的 我已经成功地使用了几种方法,但要么有一些连锁反应,要么不确定我使用的方法有多安全: 方法1:在super类上重写alloc,并将c变量设置为I所需的类: + (id) alloc { if (theClassIWant) { id object

我正试图用iphonesdk更改用nib创建的对象类

原因是,;直到运行时,我才知道我希望nib对象是什么类(尽管它们将具有相同的基于UIView的超类),并且我不希望为每种情况创建不同的nib-因为除了一个对象的类之外,每个.nib都将是相同的

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

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

+ (id) alloc {
 if (theClassIWant) {
  id object = [theClassIWant allocWithZone:NSDefaultMallocZone()]; 
  theClassIWant = nil;
  return object;
 }
 return [BaseClass allocWithZone:NSDefaultMallocZone()];
}
这工作得很好,并且我假设是“合理”安全的,尽管如果在nib中有一个具有正确类作为类标识的nib,或者我自己分配了一个子类(没有设置“ClassIwant”),那么就会创建基类的对象。我也不太喜欢凌驾于所有人之上的想法

方法2:在initWithCoder中使用object_setClass(self,classsiwant)(在超类上调用initWithCoder之前):

  • 这也可以很好地工作,但并非所有的子类都必须与超级类的大小相同,因此这可能是非常不安全的!为了解决这个问题,我尝试在initWithCoder中释放并重新分配到正确的类型,但是我从框架中得到了以下错误:

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

我不太明白这意味着什么!我正在用编码器替换init中的一个对象


欢迎对这些方法的有效性提出任何意见,或提出改进或替代方案的建议事实上,我已经改进了方法1,用“自我”作为类,如果“CLASIAWAY”没有被设置。我不知道self可以用在一个类方法中。i、 e.返回[self-allocWithZone:NSDefaultMallocZone()]+你好,我在这些方法中使用了自定义占位符对象(因为超类是nib中设置的自定义占位符对象)。问题是我不能在任何地方设置运行时的类。似乎您可以使用loadNibNamed:owner:options:中的options参数替换代理对象,但这对基于视图的对象没有帮助……或者我缺少了什么?
- (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]) {
           ...