我對標準NSObject的init()方法有問題。我寫了一個類(EFAPersistence),它是NSObject的一個子類。 EFAPersistance有一個屬性,稱爲efaDatabase。NSObject初始化方法的問題
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的所有方法?
語法note:在Objective-C中引用實例方法的正確方法是-method:name:include:colons :, not method()。例如,-init或-databaseWithPath :,而不是init()或databaseWithPath()。 – 2010-01-04 02:42:47