2011-09-21 73 views
2

我有一個從外部數據庫下載數據的單例(PTDatabaseAccsesser)。 當下載完所有數據後,單例應該調用一個委託,該委託是UITableViewController的子類。但是,我得到這個錯誤:單身代表不會工作

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[__NSCFType doneDownloadingData]: unrecognized selector sent to instance... 

這是我的委託設置的UITableViewController的子類:

- (void)viewDidLoad { 

    [[PTDatabaseAccesser sharedInstance] setDelegate:self]; 
    NSLog(@"%@", [[PTDatabaseAccesser sharedInstance] delegate]); 
} 

的的NSLog表明,一切是正確的在這裏。

這是從PTDatabaseAccsesser代碼上的代表調用:

NSLog(@"%@", [self delegate]); 
[[self delegate] doneDownloadingData]; 

的的NSLog這裏然而是示出了代表是相同類型的如在以上的錯誤消息。

這是我如何創建單:

​​

我已經確定了單的工作原理是在上述兩種方法實現使用斷點。

+1

您是否確實委託對象在將委託消息發送給它時處於活動狀態?爲了安全起見,當您釋放控制器時,您應該委託委託人。這樣你就可以防止消息發送到殭屍對象 – Lio

+0

如果這是你的意思,在委託消息發送之前調用UITableViewController子類的viewDidLoad。 – user957032

+1

@ user957032不,他意味着在設置委託和發送消息之間正在取消分配子類。要麼你的單例應該保留它的委託,要麼在子類被取消分配之前,它應該把委託屬性設置爲零。 – ughoavgfhw

回答

0

+ alloc中的代碼似乎不必要,可能是錯誤的來源。從我所看到的,sharedInstance+alloc中獲得其初始值,這意味着-sharedInstance中的if-condition可能永遠不會執行,並且您在未初始化的對象上調用方法。試試這個代碼,這也恰恰是更高效。

static PTDatabaseAccesser *sharedInstance; 

+ (void) initialize 
{ 
    sharedInstance = [[PTDatabaseAccesser alloc] init]; 
} 

+ (PTDatabaseAccesser *)sharedInstance 
{ 
    return sharedInstance; 
} 
+0

我已經嘗試過,但沒有成功:/感謝代碼,但 - 從現在開始使用它! – user957032