我必须过度思考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
答案 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
}