2010-01-03 48 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是否直接擁有該數據庫?