配列を使用しない場合はalloc
、次のような動作が発生する可能性がありinit
ますproposalInfoArray
(つまり、エラーは発生しませんが、オブジェクトにNO
メッセージを送信すると返されるため、常に返されます)。正確に言えば、それはそのような単純なものになるでしょう。そうでないことを確認してください。また、戻ってきたオブジェクトをチェックし、そうでないことを確認します。nil
nil
proposalInfoArray
nil
proposalInfo
nil
発生する可能性のある問題を説明するために、これは説明した動作を再現します(たとえば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
たっぷり使ってください!