我在Appdelegate中初始化了一些类,但是当我在另一个类中获得这个类实例形式Appdelegate时,它具有“新鲜”状态。
我在AppDelegate中有以下内容:
接口:
@property (nonatomic, retain) DataController *dataController;
实现:
@synthesize dataController;
- (id)init {
if (self = [super init]) {
DataController *controller = [[DataController alloc] init];
self.dataController = controller;
[controller release];
NSLog(@"items: %d",[self.dataController numberOfItems]);
}
return self;
}
此时DataControlelr类从数据库加载对象。日志输出显示“items:10”。
我有TableViewController,我需要使用DataController。
TableViewController标头:
@interface TableViewController : UITableViewController {
DataController *dataController;
}
@property (retain) DataController *dataController;
@end
实现:
-(id)init{
if (self =[super init]) {
DataController *dc =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataController];
[dc retain];
dataController = dc;
NSLog(@"items: %d",[self.dataController numberOfItems]);
}
return self;
}
这里总是说DataController有0个项目。 “新鲜”的状态。
日志输出始终为
项目:10
项目:0
似乎分配该类会以某种方式创建对刚刚初始化的DataController的引用?
如何正确引用另一个类?
感谢。
答案 0 :(得分:1)
要检查的第一件事是确保第二类中的dc
变量不是nil--这将导致任何调用它的方法'返回'0。
从这两种方法中打印出app委托的地址也许很有用 - 以防-init
方法是由某个地方错误分配的第二个实例产生的,而常规版本尚未以相同方式初始化(或使用-initWithCoder:
等)。
初始化在nib文件中创建或分配的对象的一个有用的经验法则是使用-awakeFromNib
来执行大多数初始化任务。这样做的一个推论是,app委托可以设置其状态以响应-applicationDidFinishLaunching:
方法。在这种情况下,如果在某处分配了AppDelegate类的第二个实例,则只有真正设置为应用程序委托的实例才会收到-applicationDidFinishLaunching:
。
在一天结束时,单步执行调试器并查看调用堆栈应该会以完全相同的方式显示某些事情是否发生。
答案 1 :(得分:0)
您在TableViewController中分配dataController = dc
会有问题吗?在您的日志语句中,您使用self.dataController
,如果您的作业直接位于其上self.dataController = dc
?
答案 2 :(得分:0)
我发现了问题。坦克给吉姆!
将-init从-init移动到-awakefromnib,现在DataController有效。
我的错误是,在最初将代码放在-viewDidLoad和-viewWillAppear之后这是错误的我认为in -init是分配的地方。