0

わお。私は今朝、この101の問題に行き詰まり、完全な精神障害を起こしました.

ViewController、このコードがあります。しかし、実行後の値[proposalInfo expanded]はまだ NO です。誰かが私が間違っていることを見ることができますか?

- (void)showFullProposal:(id) sender {

// update proposalinfo
ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:index.section];
[proposalInfo setExpanded:YES];

}

変数は次のように宣言されます。

ビューコントローラー:

@interface ViewController()

@property (nonatomic, strong) NSMutableArray* proposalInfoArray;

@end

ProposalInfo.h:

@interface ProposalInfo : NSObject

@property (assign) BOOL expanded;

@end

ProposalInfo.m:

@synthesize expanded;

助けてください!!

4

2 に答える 2

3

配列を使用しない場合は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たっぷり使ってください!

于 2012-11-24T12:48:39.777 に答える
2

Imme、次の行は奇妙に思えます:

ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:index.section];

実際、あなたの配列にあるものは、 in を意味しproposalInfoArrayます。オブジェクトをチェックしましたか?

于 2012-11-24T12:37:51.387 に答える