通过委托访问变量

时间:2011-04-13 04:59:01

标签: iphone objective-c

我在Objective-C中进行了一个情境,我试图通过另一个对象访问一个对象的变量。课程(简化):

A.H

@interface A : NSObject {  
  NSMutableArray *someStuff;  
}  

@property (nonatomic, retain) NSMutableArray *someStuff;    

@end 

A.M

@implementation A  

@synthesize someStuff;  

//  blah, blah, blah  

然后,因为我正在做一个iPhone应用程序,所以有一个app委托包含这个对象类型的变量:

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate> {  

   A *aPtr;  
}  

@property (nonatomic, retain) A *aPtr;  
@end  

AppDelegate.m

@implementation AppDelegate  

@synthesize aPtr;  
// blah, blah, blah  

然后,在另一个类(在这个视图控制器中),我试图以这种方式访问​​'someStuff':

AViewController.m

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];  

NSMutableArray *someArray = appDelegate.aPtr.someStuff;  

所以,问题在于这种方式很好。我认为我太多了Java瘾君子,无法理解为什么这不起作用。有谁能让我高兴吗?

非常感谢,

克雷格

4 个答案:

答案 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不同的类,在这种情况下,您将获得无法识别的选择器异常(您应该能够在错误日志中看到它)并且程序崩溃。