获取指向超类中保存的数组的指针

时间:2013-12-30 04:53:18

标签: objective-c polymorphism

研究目标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

它崩溃了应用程序。我已经尝试了很多不同的方法,但我总是崩溃。谁能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您已编写self.myArray来访问实例变量。点表示法是属性访问权限,即使未声明为属性,也会调用类似属性的方法。在您的情况下,这意味着您尝试访问实例变量实际上是一个自递归调用,这将导致堆栈溢出。

要访问实例变量,只需使用它的名称或->成员访问运算符,例如_myArrayself->_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:

  1. 属性可以具有readonly属性。

  2. 在派生类中使用super是无用且危险的。它不使用super的上下文(它不存在,因为每个实例对象只有一个上下文从整个类层次结构构建),但是使用了该方法的超级实现。您没有在派生类中覆盖此实现。 self也可以使用,并且可以覆盖吸气剂。