2011-05-12 162 views
1

一個非常具體的問題,因此對其進行研究很困難。這對我來說似乎很簡單,但我做錯了什麼,我看不到它是什麼。「可能不會迴應」警告

我創建了以下方法:

- (NSComparisonResult) searchBuildingObject:(NSDictionary *) building forString:(NSString *) searchString { 

    NSComparisonResult buildingComparison = [[building objectForKey:@"building"] compare:searchString 
                       options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) 
                        range:NSMakeRange(0, [searchString length])]; 

    if (buildingComparison != NSOrderedSame) { 

     for (NSString *alias in [building objectForKey:@"alias"]) { 

      NSComparisonResult aliasComparison = [alias compare:searchString 
                 options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) 
                  range:NSMakeRange(0, [searchString length])]; 

      if (aliasComparison == NSOrderedSame) 
       return aliasComparison; 
     } 
    } 

    return buildingComparison; 

} 

這似乎是工作的罰款,甚至當我測試它給了我正確的結果的方法。然而,我仍然在調用該方法得到一個警告:

[self searchBuildingObject:[self.buildings objectForKey:building] forString:searchText] 

我確信建築是一個NSDictionary,並搜索字符串絕對是一個NSString。該方法的結果是NSComparisonResult然後我比較NSOrderedSame

NSComparisonResult result = [self searchBuildingObject:[self.buildings objectForKey:building] forString:searchText]; 
if (result == NSOrderedSame) NSLog(@"Same"); 

我得到的是「BuildingsViewController可能不響應警告‘-searchBuildingObject:forString:’任何人都不會看到有什麼不對

回答

0

宣稱,通常警告表明您已經忘記申報方法的接口的引用的目標:

@interface BuildingsViewController : ControllerSuperclass { 
     // Declaration of ivars... 
} 

- (NSComparisonResult) searchBuildingObject:(NSDictionary *) building forString:(NSString *) searchString; 
// Other method declarations... 

@end 

這是一個警告,而不是錯誤的原因是,它的編譯器抱怨,這不是一定,你可以調用該對象的這個方法。聲明是編譯器所做的決定。

編譯器也知道這是沒有申報的方法,但其定義你叫他們之前(這僅適用於單一的編譯單元內 - 嚴格地講,一個類可以調用它自己的方法,該方法不有一個聲明,沒有編譯器的抱怨,如果該方法的實現位於其在文件中的使用之前,而不是一個偉大的事情依靠)。

方法查找/解析稍後在運行時完成,編譯器不知道這一點。由於該方法確實存在於您的課程中,因此此時調用成功。

+0

啊,我明白了!謝謝。有一件事我不明白,爲什麼我以前從來沒有得到過這個錯誤。我之前創建了方法,我沒有聲明(我忘了,我沒有得到一個錯誤提醒我),但這是我第一次得到這個錯誤... – 2011-05-12 20:53:16

+0

可能他們是來自超類的方法,你只是壓倒? – 2011-05-12 20:55:35

+0

不太可能,但我想可能,我不記得確切的情況了。無論我是否通過論證,它都會有所作爲嗎?這是我第一個需要參數的方法,所以也許可能是這樣嗎? – 2011-05-12 20:59:29

1

確保此方法是在你的@interface

1

在某些情況下,它不能在類中定義在這種情況下,你可以使用以下命令:

[obj performSelector:@selector(methodName)]; 

不理想,但是當你需要它,你需要它! :)

相關問題