gpt4 book ai didi

iphone - 更改使用 loadNibNamed 实例化的类

转载 作者:行者123 更新时间:2023-12-03 20:16:59 30 4
gpt4 key购买 nike

我正在尝试使用 iPhone SDK 更改使用 Nib 创建的对象的类。

原因是;直到运行时我才知道我想要的 nib 对象是什么类(尽管它们将具有相同的基于 UIView 的父类(super class)),并且我不想为每种可能性创建不同的 nib - 因为 .nib 将是除了一个对象的类之外,每个对象都相同。

我使用了几种方法取得了成功,但要么有一些链式 react ,要么不确定我使用的方法有多安全:

方法 1:在父类(super class)上重写 alloc,并将 c 变量设置为我需要的类:

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

这工作得很好,我认为是“相当”安全的,尽管如果有一个具有正确类的 Nib 作为 Nib 中的类标识,或者我自己分配一个子类(不设置“theClassIWant”)-一个对象基类已创建。我也不太喜欢重写分配的想法...

方法 2:在 initWithCoder 中使用 object_setClass(self,theClassIWant) (在父类(super class)上调用 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]) {
...
  • 这也很好用,但并非所有子类都必须与父类(super class)具有相同的大小,因此这可能非常不安全!为了解决这个问题,我尝试在 initWithCoder 中释放并重新分配到正确的类型,但我从框架中收到以下错误:

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

不太明白这意味着什么!我正在替换 initWithCoder 中的一个对象...

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

最佳答案

虽然我很好奇您是否可以使用您的方法来实现这一目标,但您可能需要考虑使用 custom placeholder objects .

关于iphone - 更改使用 loadNibNamed 实例化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2764154/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com