2010-01-03 43 views
1

我对标准NSObject的init()方法有问题。我写了一个类(EFAPersistence),它是NSObject的一个子类。 EFAPersistance有一个属性,称为efaDatabaseNSObject初始化方法的问题

EFAPersistence.h

@interface EFAPersistence : NSObject { 
    FMDatabase * efaDatabase; 
} 

@property (assign) FMDatabase * efaDatabase; 

每次EFAPersistance的一个实例被创建我想分配efaDatabase从我的AppDelegate的值。

EFAPersistence.m

@implementation EFAPersistence 

@synthesize efaDatabase; 

- (id)init { 
    if (self = [super init]) { 
    efaDatabase = [[NSApp delegate] efaDatabase]; 
    } 
    return self; 
} 

@end 

分配的这种方法是行不通的。但是,如果我把代码放在一个普通的方法中,它就会有效。所以我相信efaDatabase在我的AppDelegate中正确实例化了。这只是在我的init()方法中不起作用。这就是为什么我觉得NSApp不在init()方法中工作。

这就是重要的AppDelegate代码的样子。

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate> { 
    FMDatabase * efaDatabase; 
} 

AppDelegate.m

- (id)init { 
    if (self = [super init]) { 
    NSString * databasePath = 
     [[NSBundle mainBundle] pathForResource:@"efa" ofType:@"sqlite"]; 

    self.efaDatabase = [FMDatabase databaseWithPath:databasePath]; 

    if (![efaDatabase open]) { 
     NSLog(@"Couldn't open database: %@", databasePath); 
     // TODO: Create a database here 
    } 
    self.db = [[EFAPersistence alloc] init]; 
    } 
    return self; 
} 

正如你可以看到,我调用init方法。我也通过使用NSLog()来确认这一点。 init()被调用。我试图在EFAPersistence中分配的属性也是在init()被调用之前创建的。

总结了一切:

我怎样才能让init()方法中的这个工作,所以我没有写锅炉板代码在我EFAPersistence的所有方法?

+0

语法note:在Objective-C中引用实例方法的正确方法是-method:name:include:colons :, not method()。例如,-init或-databaseWithPath :,而不是init()或databaseWithPath()。 – 2010-01-04 02:42:47

回答

4

在我看来,当您尝试首次创建EFAPersistance对象时,您的AppDelegate未设置。这是下面线AppDelegate.m

self.db = [[EFAPersistence alloc] init]; 

我想象init完成后的应用程序代理设置(返回)。

+0

我也认为,NSApp是创建/分配或任何后init()。问题是如何仅在EFAPersistences中分配efaDatabase一次。还有其他的方法,如awakeFromNib和viewDidLoad等,但这些在普通的NSObject子类中不可用。 – Jens 2010-01-03 09:43:47

+0

@Jens如何执行'self.db.efaDatabase = efaDatabase;'就在我上面提到的那一行之后? – epatel 2010-01-03 09:49:14

+0

在self.db上设置efaDatabase后,实例化它,工作。谢谢你们。 – Jens 2010-01-03 10:33:45

4

这种分配方式不起作用。但是,如果我把代码放在一个普通的方法中,它就会有效。所以我相信efaDatabase在我的AppDelegate中正确实例化了。这只是在我的init()方法中不起作用。这就是为什么我觉得NSApp不在init()方法中工作。

NSApp工作正常。

报价epatel:

我想象中的初始化完成后的应用程序代理设置(返回)。

正确。nib加载程序完全实例化每个对象(包括应用程序代理,如果它在nib中),则然后将其设置为它所连接的任何属性的值。这是两个独立的操作;它不会将未初始化的对象设置为应用程序委托。

引用您(延)再次:

的问题是如何在EFAPersistences分配efaDatabase只有一次。还有其他的方法,如awakeFromNib和viewDidLoad等,但这些在普通的NSObject子类中不可用。

错误。 awakeFromNib发送到对象在笔尖对象已被初始化后。

这就是说,我很好奇你为什么在笔尖有EFAP​​ersistence。从它的名字来看,它听起来不像界面相关。应用程序委托人是否应拥有EFAP​​ersistence,并且EFAPersistence是否直接拥有该数据库?