配列を使用しない場合はalloc、次のような動作が発生する可能性がありinitますproposalInfoArray(つまり、エラーは発生しませんが、オブジェクトにNOメッセージを送信すると返されるため、常に返されます)。正確に言えば、それはそのような単純なものになるでしょう。そうでないことを確認してください。また、戻ってきたオブジェクトをチェックし、そうでないことを確認します。nilnilproposalInfoArraynilproposalInfonil
発生する可能性のある問題を説明するために、これは説明した動作を再現します(たとえばexpanded、それがそうであるように見えNOますが、それでも例外は発生しません)。
self.proposalInfoArray = nil; // This obviously won't work
[self.proposalInfoArray addObject:[[ProposalInfo alloc] init]];
ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:0];
NSLog(@"before=%d", proposalInfo.expanded); // OK, IT'S "0"
proposalInfo.expanded = YES;
NSLog(@"after=%d", proposalInfo.expanded); // HEY, IT'S STILL "0" -- BAD!
これは正しく機能しますが:
self.proposalInfoArray = [[NSMutableArray alloc] init];
[self.proposalInfoArray addObject:[[ProposalInfo alloc] init]];
ProposalInfo * proposalInfo = [self.proposalInfoArray objectAtIndex:0];
NSLog(@"before=%d", proposalInfo.expanded); // OK, IT'S "0"
proposalInfo.expanded = YES;
NSLog(@"after=%d", proposalInfo.expanded); // HEY, IT'S NOW "1" -- GOOD!
将来これらの問題を特定する方法については、を使用してNSAssertください。この行の前に次のコード行がある場合、この問題が見つかりますobjectAtIndex。
NSAssert(self.proposalInfoArray, @"proposalInfoArray must be initialized!");
または、objectForIndex:の後
NSAssert(proposalInfo, @"proposalInfo must not be nil!");
ステートメントの良いところNSAssertは、ステートメントをコードに含めることができることです。デバッグ用にビルドすると、プログラムロジックの間違いを見つけるのに役立ちますが、最終リリースバージョンをビルドすると、ステートメントは自動的に省略され、コードがさらに作成されます。効率的。だから、NSAssertたっぷり使ってください!