2017-04-27 84 views
1

我有一個很奇怪的問題,我似乎無法看到原因。類別擴展不一致iOS 10+

我對NSDictionary有一個名爲title的方法的類別擴展。該方法的工作原理如下:

- (NSString*)title { 
    return self[@"title"]; 
} 

這是什麼讓我做的,是有一個方法在NSDictionary傳回標題。

下面是使用的例子:

NSDictionary *config = [mConfigManager currentConfig]; 

if ([config title]) { 

    return [config title]; 
} 
return @""; 

現在,這是事情變得奇怪。在iOS 10上,標題方法有時返回零。如果返回零,則手動撥打config[@"title"]返回該值。因此,我已經調整了我的代碼,如下所示:

NSDictionary *config = [mConfigManager currentConfig]; 

if ([config title]) { 

    return [config title]; 
} 
else if(config[@"title"]) 
{ 
    return config[@"title"]; 
} 
return @""; 

通過上面的代碼,它總是返回標題(如果存在)。但它有時僅適用於else if的情況,而不適用於類別版本。

所以,問題是:

爲什麼會當它做同樣的事情手動調用的類沒有返回值?

是什麼讓這個更奇怪的是它有時工作:請參閱下面的日誌輸出:

第一次點擊

(lldb) po [config title] 
Joe Bloggs 

第二次點擊

(lldb) po [config title] 
nil 
(lldb) po config[@"title"] 
Joe Bloggs 

注:上述日誌都運行d通過選擇表視圖單元格觸發應用程序的相同實例。因此,這消除了任何可能發生釋放或重新分配的情況。

一兩件事,但是我已經注意到了,就是控制檯不會輸出config內容,而是返回了以下錯誤:

<object returned empty description> 

變量視圖但充分顯示了對象和所有變量。該對象在變量列表中定義爲NSDictionaryM

任何與此有關的幫助將大規模讚賞。

在此先感謝

+1

用重命名你的方法前綴,看看你是否可以重現這一點。另外,'[mConfigManager currentConfig]'裏面發生了什麼? –

+0

該行在返回'nil'時沒有中斷,因此它給人的印象是它沒有被調用。 '[mConfigManager currentConfig]'只返回一個NSDictionary對象。 –

回答

1

很有可能一些在系統一樣,可能從蘋果(可能),也於類別創建於NSDictionary一個title方法。當在類別中定義了兩個具有相同名稱的方法時,未定義哪一個將被執行。 (當我在私人類別中添加popNSMutableArray時,我親自遇到過這種情況,並且我的程序以不可預測的方式出現故障。)

您必須爲您的類別方法(即mc_title或其他)加上前綴。蘋果應爲前綴他們的私人方法,但他們不,所以你必須。

(當然,想要此方法添加到NSDictionary強烈建議您真的應該創建一個小的數據類,而不是使用字典對於這一點,但是這是一個完全獨立的問題。)

+0

我會試一試,看看是否是這個問題 –

+0

關於對象的設計,代碼最初是由其他人編寫的,我已被引入修復bug。就我個人而言,我也會走下課程路線:) –