2017-04-27 7 views
1

私は非常に奇妙な問題を抱えています。カテゴリ拡張の不一致iOS 10+

私は、タイトルと呼ばれるメソッドを持つNSDictionaryのカテゴリ拡張を持っています。このメソッドは次のように機能します:

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

これが私にできることは、NSDictionary上でタイトルを返すためのコンビスメソッドを持つことです。ここで

は使用例です:物事が奇妙な取得する場所

NSDictionary *config = [mConfigManager currentConfig]; 

if ([config title]) { 

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

は今、これがあります。 iOS 10では、タイトルメソッドは時々でnilを返します。これがnilを返す場合、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アプリの同じインスタンスを確認するには、テーブルビューのセルを選択します。これにより、割り当て解除または再割り当てが発生する可能性のあるすべてのケースが排除されます。

<object returned empty description> 

変数ビューには、しかし、完全にオブジェクトとすべての変数を示しています。私はしかし、気づいた

一つは、コンソール出力がconfigの内容、代わりに次のエラーが返されないことです。オブジェクトは変数リストにNSDictionaryMと定義されています。

これに関するお手伝いは大変ありがとうございます。アップルからおそらく

事前

+1

であなたのメソッドの名前を変更します(もちろん、NSDictionaryにこのメソッドを追加したいと、強くあなたが本当に代わりにこの辞書を使用しての小さなデータクラスを作成する必要がありますが、それは完全に別の問題だ。ことを示唆しています)これを再現できるかどうかを確認してください。また、 '[mConfigManager currentConfig]'の内部で何が起こっていますか? –

+0

'nil'を返すときに行が壊れないので、呼び出されていないという印象を与えます。 '[mConfigManager currentConfig]'はNSDictionaryオブジェクトを返します。 –

答えて

1

のおかげで非常に可能性の高いシステムで何か他のもの、(おそらく)は、また、カテゴリ内のNSDictionarytitleメソッドを作成しました。カテゴリに同じ名前のメソッドが2つある場合、どのメソッドが実行されるかは不定です。 (AppleがpopNSMutableArrayにプライベートカテゴリで追加したときに私は個人的に遭遇し、私のプログラムは予測不可能なやり方で乾いた。)

カテゴリメソッドには、プレフィックス(つまり、mc_titleなど)を付ける必要があります。アップルのにプライベートメソッドを接頭辞する必要があります。

+0

私はこれを試してみると、これが問題であるかどうかを確認します –

+0

オブジェクトのデザインに関して、コードはもともと誰かによって書かれたものです。私はバグ修正のために持ち込まれました。個人的に私はクラスルートにも行ってしまったでしょう:) –