2009-06-01 67 views
0

我有一些在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类负载对象形式的数据库。日志输出显示“项目: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类不知何故?

如何正确引用另一个类?

谢谢。

回答

1

检查是确保在第二类中的dc变量不nil--会导致调用它以“回归” 0

任何方法也可能是有用的第一件事从这两种方法中打印应用程序委托的地址 - 以防万一-init方法是由某个地方错误地分配了该类的第二个实例导致的,而普通版本没有以相同方式初始化(或正在使用-initWithCoder:等)

对于在nib文件内创建或分配的对象的初始化,一个有用的经验法则是使用-awakeFromNib执行大部分初始化任务。对此的推论是应用程序委托可以设置其状态以响应-applicationDidFinishLaunching:方法。在这种情况下,如果有AppDelegate类的第二个实例被分配到某处,那么只有真的被设置为应用程序的代理将收到-applicationDidFinishLaunching:

在一天结束时,在调试器中单步调试并查看调用堆栈应该会告诉您是否应该以某种方式发生某些事情。

0

TableViewController中的dataController = dc任务有问题吗?在您的日志声明中,您使用self.dataController,如果您的任务直接在self.dataController = dc之上?

+0

抱歉粘贴错误。它是self.datacontroller = dc。 没有任何区别。 – Rod 2009-06-01 17:29:41

0

我发现了这个问题。坦克对吉姆!

将分配从-init移至-awakefromnib,现在DataController有效。

我的错误是,将代码最初放在-viewDidLoad和-viewWillAppear这是错误的,我认为在-init是分配的地方。

相关问题