2009-07-01 8 views
2

私はiPhoneのプログラミングに全面的な騒ぎをしています。私は例外を投げて投げられてしまいました。NSMutableDictionaryはdoesNotRecognizeSelectorをobjectForKeyにスローしますか?

背景:カスタムサブビューでエラーが発生しており、プログラムのロード直後にエラーが発生します。オーバーライドされたdrawRectメソッドで例外がスローされています。エラーを投げるコードは次のとおりです。

- (void)drawRect:(CGRect)rect{ 
    NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints]; 
    //HERE. Doesn't recognize selector?! 
    CGPathRef t = (CGPathRef)[starPaths objectForKey:points]; 
/*snip*/ 

starPathsは、容量のNSMutableDictionaryとしてawakeFromNibで初期化された1

投げだ例外はある - [NSObjectのdoesNotRecognizeSelector:]

starPathsがで宣言されていますヘッダ

NSMutableDictionary *starPaths; 

としてビューのファイルと

として初期化されます
- (void)awakeFromNib{ 
    starPaths = [NSMutableDictionary dictionaryWithCapacity: 1]; 
} 

最後に、エントリを追加するコードがディクショナリから無関係の応答を受け取ることに依存しているため、コード内で要素を正常に辞書に追加することができませんでしたその特定のエントリを構築する必要があります。

提案がありますか?私が提供すべき他の情報は? 何か助けていただければ幸いです。私は何か明白なものを見逃しているように感じますが、私は一日中、この運に反対して頭を叩いています。

+1

starPathsが初期化されているawakeFromNibの関連部分を投稿できますか? – marcc

+1

また、starPathsのインスタンス変数宣言。 -setObject:forKey:などでキーと値のペアを辞書に追加する場所はありますか? –

答えて

5

retainstarPaths変数を使用していないか、[[NSMutableDictionary alloc] initWithCapacity:1]で明示的に割り当てている場合は、実行ループの次の繰り返しで自動的に解放されます。

あなたが

starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain]; 

それとも

starPaths = [[NSMutableDictionary alloc] initWithCapacity:1]; 

だけreleaseに確認して行う必要があり、それあなたは、もはやそれを必要としません。

+3

インスタンス変数を設定したいときはいつでも、セッターを使うだけです。これによりコードの一貫性が保たれ、メモリ管理の負担がすべて1つの方法にかかります。 – Chuck

+0

それは本当に良いでしょう。 – dreamlax

+0

ああ!私はその点に達する前に辞書の割り当てが解除されることに気付かなかった。それを保持して問題を解決しました。ありがとう! – Zxaos

1

チェックするためにいくつかのこと:

  • starPathsはNSMutableDictionary *インスタンス変数として宣言されていますか?あなたはそれが初期化されていると言います。自動リリースオブジェクトを返すdictionaryWithCapacityメソッドまたは明示的に保持する必要があるinitWithCapacityメソッドを使用しましたか?安全のためには、それを保持し、完了したら解放することができます。

  • ヘッダファイルが適切に含まれていることを確認して、starPathsの宣言がそれを利用する実装ファイルに含まれるようにしてください。

  • 一般的に言えば、謎のエラーが発生している場合は、壊れたメモリと関係しています。 drawRectメソッドの最初の行にブレークポイントを置き、デバッガのコンソールウィンドウで "po starPaths"を実行して、その内容と実行時のオブジェクトの種類を確認してください。

関連する問題