我正在尝试使用iPhone SDK更改使用nib创建的对象类。
原因是;我直到运行时才知道该类是什么,我想要nib对象(虽然它们将具有相同的基于UIView的超类),并且我不想为每个可能性创建不同的笔尖 - 因为.nib将是除了一个对象的类之外,每个都相同。
我已经成功了,有几种方法,但要么有一些敲击效果,要么不确定我使用的方法有多安全:
方法1:在超类上覆盖alloc,并将c变量设置为我需要的类:
+ (id) alloc {
if (theClassIWant) {
id object = [theClassIWant allocWithZone:NSDefaultMallocZone()];
theClassIWant = nil;
return object;
}
return [BaseClass allocWithZone:NSDefaultMallocZone()];
}
这很好用,我假设“合理”安全,但是如果有一个带有正确类的笔尖作为Nib中的类标识,或者我自己分配一个子类(没有设置'theClassIWant') - 一个对象基类已创建。我也不喜欢重写分配的想法......
方法2:在initWithCoder中使用object_setClass(self,theClassIWant)(在超类上调用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中的对象......
对这些方法的有效性或改进或替代方案的建议表示欢迎!