我正在尝试用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中的对象…
欢迎对这些方法的有效性提出任何意见,或提出改进建议或替代方案!