2

nib我有一个从文件初始化自身的基类。我怎样才能继承这个class。每次我初始化subclass它时,它都会创建一个基类的对象,而不是class我试图创建的实际对象

基类

@implementation BaseClass
- (id)init{
   self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" 
                                          owner:self 
                                        options:nil] lastObject] retain];
   if (self){
   }

   return self;
}

@end

一类

@implementation MyClass //Inheriting from BaseClass
- (void)init {
   self = [super init];

   if (self) {
   }

   return self;
}

- (void)methodSpecificToThisClass {
   //do something
}
@end

用法

// It crashes when I call 'methodSpecificToThisClass' 
// because the type that has been created is a type 
// of my BaseClass instead of MyClass
MyClass *myClass = [[MyClass alloc] init];
[myClass methodSpecificToThisClass];
4

2 回答 2

3

更改self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" owner:self options:nil] lastObject] retain];self = [[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] lastObject] retain];

这当然是假设您对每种视图类型都有单独的笔尖。

于 2011-08-01T22:50:21.157 回答
2

因为你总是从同一个 nib 文件中加载对象,所以你总是得到相同的对象。如果 nib 中的对象是 type ,那么当你加载 nib 时你BaseClass会得到一个 type 的对象。BaseClass你分配一个并不重要MyClass——你分配的东西不会发挥作用,因为你分配self给加载的对象。(事实上​​,由于您在重新分配之前从未释放分配的内存self,因此您正在泄漏分配的内存。)您已将指针声明为 - 也无关紧要MyClass*- 让您-methodSpecificToThisClass无需获取即可调用来自编译器的抱怨,但它并没有改变实际对象是一个实例的事实BaseClass. 当您调用该方法时,当运行时尝试解析选择器并发现该对象不存在该选择器时,您会收到“未实现的选择器”错误。

如果MyClass要从 nib 加载 a ,则必须使用包含 aMyClass而不是a 的 nib BaseClass

于 2011-08-02T01:25:36.757 回答