研究目标c中的多态性。我正在尝试使用我的超类所持有的NSMutableArray
做一些事情,所以我需要从子类中指向它的指针。
SuperViewController.h
@interface SuperViewController : UIViewController
- (NSMutableArray *) myArray;
@end
SuperViewController.m
@interface SuperViewController()
@property (strong, nonatomic) NSMutableArray *myArray;
@end
@implementation SuperViewController
- (NSMutableArray *) myArray {return self.myArray;}
@end
然后,在我的子类中,我有这个:
SubViewController.h
#import SuperViewController.h
@interface SubViewController : SuperViewController
- (void) updateUI;
@end
SubViewController.m
@implementation
- (void) updateUI
{
(NSMutableArray *) myArray = [super myArray];
}
@end
它崩溃了应用程序。我已经尝试了很多不同的方法,但我总是崩溃。谁能帮我吗?谢谢!
答案 0 :(得分:1)
您已编写self.myArray
来访问实例变量。点表示法是属性访问权限,即使未声明为属性,也会调用类似属性的方法。在您的情况下,这意味着您尝试访问实例变量实际上是一个自递归调用,这将导致堆栈溢出。
要访问实例变量,只需使用它的名称或->
成员访问运算符,例如_myArray
或self->_myArray
。
答案 1 :(得分:1)
原因是,你有一个递归会破坏堆栈:
- (NSMutableArray *) myArray
{
return self.myArray;
}
此方法调用自身。点表示法是方法调用的简短形式:
- (NSMutableArray *) myArray
{
return [self myArray];
}
不正如您所预期的那样访问对象的上下文(ivar):
- (NSMutableArray *) myArray
{
return self->_myArray;
}
正确的方法是直接使用ivar:
- (NSMutableArray *) myArray
{
return _myArray;
}
BTW:
属性可以具有readonly
属性。
在派生类中使用super
是无用且危险的。它不使用super的上下文(它不存在,因为每个实例对象只有一个上下文从整个类层次结构构建),但是使用了该方法的超级实现。您没有在派生类中覆盖此实现。 self
也可以使用,并且可以覆盖吸气剂。