我在Objective-C中进行了一个情境,我试图通过另一个对象访问一个对象的变量。课程(简化):
@interface A : NSObject {
NSMutableArray *someStuff;
}
@property (nonatomic, retain) NSMutableArray *someStuff;
@end
@implementation A
@synthesize someStuff;
// blah, blah, blah
然后,因为我正在做一个iPhone应用程序,所以有一个app委托包含这个对象类型的变量:
@interface AppDelegate : NSObject <UIApplicationDelegate> {
A *aPtr;
}
@property (nonatomic, retain) A *aPtr;
@end
@implementation AppDelegate
@synthesize aPtr;
// blah, blah, blah
然后,在另一个类(在这个视图控制器中),我试图以这种方式访问'someStuff':
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSMutableArray *someArray = appDelegate.aPtr.someStuff;
所以,问题在于这种方式很好。我认为我太多了Java瘾君子,无法理解为什么这不起作用。有谁能让我高兴吗?
非常感谢,
克雷格
答案 0 :(得分:1)
您需要以这种方式初始化
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSMutableArray *someArray = appDelegate.someArray;
这将解决您的问题.....
答案 1 :(得分:0)
克雷格,
appDelegate.aPtr
将返回null
。因为它还没有被初始化,当你试图访问null
对象的某个成员时(在java NULLPointerException
中)。它的行为是预期的。(这很好地爆发了。) / p>
谢谢,
答案 2 :(得分:0)
拉文是对的。类定义定义了类的iVars和属性,因此您定义了引用类型为aPtr
的对象的iVar A
。但是,您尚未分配和初始化此对象。
使用默认初始化的示例是`aPtr = [[A alloc] init]'。
答案 3 :(得分:0)
这一切听起来都很可疑,因为在ObjC中你可以毫无问题地发送消息给nil而且属性只是数字化的方法。例如,你可以
view = nil;
view.hidden = NO;
并且它不会爆炸,它什么都不做。
因为appDelegate.aPtr.someStuff只是
[[appDelegate aPtr] someStuff];
和[appDelegate aPtr]什么也不做,并且返回nil所以调用[[appDelegate aPtr] someStuff]应该是安全的,没有任何问题,但也没有任何结果。
所以虽然使用尚未初始化的对象(通常应该在相应对象的指定构造函数中完成)是一个问题,因为你没有得到你期望的结果,在我未知的在ObjC中“向nil发送消息”它不应该爆炸。如果是,那么要么我错过了重点,要么其他原因导致问题,而不是这个电话。
修改强>
刚检查:如果没有初始化,它就像我解释的那样工作:ObjC允许将消息发送到nil:
A *aPtr = appDelegate.aPtr;
NSMutableArray *someArray = aPtr.someStuff;
NSLog(@"%@", someArray);
或
NSMutableArray *someArray = appDelegate.aPtr.someStuff;
NSLog(@"%@", someArray);
两者都不会中断并打印null。
如果正确初始化A但未在A中初始化someStuff,它仍然不会中断但是打印为null。问题可能是您将aPtr初始化为与A不同的类,在这种情况下,您将获得无法识别的选择器异常(您应该能够在错误日志中看到它)并且程序崩溃。