1

我在objective-c中使用工廠模式,但由於某種原因,它從來沒有調用子類的方法..我會通過代碼解釋:爲什麼Xcode總是使用超類的方法而不是子類

// MailBoxViewController.m -- file using the factory: 
SearchWorker* searchWorker = [SearchWorkerFactory getSearchWorker:param]; 
// whenever I call this method, it's always the one belonging to SearchWorker, 
// rather than any of it's children classes, even if on breakpoint here, searchWorker 
// is of class type AllSearchWorker 
[searchWorker search:[searchParams objectForKey:@"query"] withDelegate:self withSnippedDelims:snippetDelims startWithDB:dbNum]; 


// searchWorkerFactory.m 
#import "SearchWorkerFactory.h" 
#import "SearchWorker.h" 
#import "AllSearchWorker.h"  
@implementation SearchWorkerFactory  
+(id)getSearchWorker:(SearchWorkerType)syncType {   
    if (syncType == SearchWorkerTypeAll) { 
     AllSearchWorker* searchWorker = [[AllSearchWorker alloc] init]; 
     return searchWorker; 
    } 
    return nil; 
}  
@end 


// SearchWorker.h 
@interface SearchWorker : NSObject 
-(void)search:(NSString *)query withDelegate:(id)delegate withSnippedDelims:(NSArray *)snippedDelims startWithDB:(int)dbIndex;  
@property (assign) volatile BOOL cancelled; // flag for when we cancel a search op 
@property (nonatomic,readwrite,retain) NSOperationQueue *operationQueue; 
@end 

// SearchWorker.m 
@implementation SearchWorker 
.. 
-(void)search:(NSString *)query withDelegate:(id)delegate withSnippedDelims:(NSArray *)snippedDelims startWithDB:(int)dbIndex { 
    [NSException raise:NSInternalInconsistencyException 
       format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; 
} 
@end 


// AllSearchWorker.h 
@interface AllSearchWorker : SearchWorker 
-(void)search:(NSString *)query withDelegate:(id)delegate withSnippetDelims:(NSArray *)snippetDelims startWithDB:(int)dbIndex; 
@end 

// AllSearchWorker.m 
@implementation AllSearchWorker 
.. 
- (void)search:(NSString*)query withDelegate:(id)delegate withSnippetDelims:(NSArray *)snippetDelims startWithDB:(int)dbIndex { 
    // implementation 
} 
@end 

,所以我總是得到錯誤信息:

*終止應用程序由於未捕獲的異常 'NSInternalInconsistencyException',理由是:「你必須覆蓋 搜索:withDelegate:withSnippedDelims:startWithDB:在子類' *第一次撥打電話:

任何想法爲什麼會發生這種情況?也如果我控制點擊方法search:withDelegate:withSnippedDelims:startWithDB,xcode立即跳轉到SearchWorker.m(即它不給我一個文件列表,這種方法存在)..如果我從SearchWorker.m刪除該方法,它抱怨說,這種方法doesn' t存在..想法?

回答

3

這些是兩種不同的方法。您已經使用在超snippedsnippet在子類

-(void)search:(NSString *)query withDelegate:(id)delegate withSnippetDelims:(NSArray *)snippetDelims startWithDB:(int)dbIndex; 
                    ^

-(void)search:(NSString *)query withDelegate:(id)delegate withSnippedDelims:(NSArray *)snippedDelims startWithDB:(int)dbIndex { 
                    ^
+0

天啊..有人請我一拳! – abbood 2013-04-11 08:07:13

相關問題