在父级中访问数组不返回任何对象

时间:2014-01-27 00:04:36

标签: ios objective-c inheritance properties subclass

我必须过度思考Objective-C中这个简单的父和子类通信。

我在父视图控制器中创建并填充NSMutableArray,然后在子类View Controller中我想访问该数组中的对象。 Xcode没有抛出任何错误,但在子类中它没有在数组中找到任何对象。我做错了什么?

Parent.h:

@interface ParentViewController : UIViewController
@property (strong, nonatomic) NSMutableArray *myArray;
@end

Parent.m:

[self.myArray addObject:myString]; //add objects to array in a method

Subclass.h:

#import "ParentViewController.h"
@interface SubclassViewController : ParentViewController
@end

Subclass.m:

#import "SubclassController.h"
@implementation SubclassViewController
- (void)myMethod {
    NSLog(@"%d in parent array", [super.myArray count]); //always returns 0
}
@end

3 个答案:

答案 0 :(得分:3)

这取决于您将此行放在代码中的位置(使用哪种方法):

  

[self.myArray addObject:myString]; //add objects to array in a method

你可以把它放在你的parentViewController的-viewDidLoad方法中,如果你在SubclassViewController中调用[super viewDidLoad](或者你根本没有在你的SubclassViewController中实现viewDidLoad方法)它实际上会有效。

问题在于你混淆了一个类和一个对象: 您在屏幕末尾看到的是您的班级parentViewController实例和班级SubclassViewController实例,即它们是两个不同的对象。就像Sam和Bob是“人类”这两个不同的“对象”一样。现在他们都有一个属性myArray - 就像Sam和Bob都携带的列表一样。但由于他们是两个不同的人,他们也有不同的名单。如果Sam在他的名单上写了一些笔记,那并不意味着这些笔记也会自动出现在Bob的名单上。

答案 1 :(得分:2)

您需要通过在Parent.m init方法中分配内容来为可变数组分配内存:

self.myArray = [NSMutableArray array];

答案 2 :(得分:0)

无需使用“super.myArray”。父类中定义的所有属性都是子类的属性。你也可以使用“self.myArray”它们是同一个对象。

我的猜测是你实际上在处理2个不同的对象。发布创建对象的代码,以及包含行

的完整方法
[self.myArray addObject:myString]; 

还要在两段代码中添加self的日志:

[self.myArray addObject:myString]; 
NSLog(@"In %s for %@, self.myArray = %@", __PRETTY_FUNCTION__, self, self.myArray);

- (void)myMethod 
{
  NSLog(@"In %s for %@ array = %@", __PRETTY_FUNCTION__, self, self.myArray); //always returns 0
}