哇。今天早上,我完全陷入了这个101问题的精神衰竭。

ViewController中,我有此代码。但是执行后,[proposalInfo expanded]的值仍为NO。有人可以看到我在做什么吗?

- (void)showFullProposal:(id) sender {

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

}


变量声明如下:

ViewController:

@interface ViewController()

@property (nonatomic, strong) NSMutableArray* proposalInfoArray;

@end


ProposalInfo.h:

@interface ProposalInfo : NSObject

@property (assign) BOOL expanded;

@end


ProposalInfo.m:

@synthesize expanded;


请帮忙!!

最佳答案

如果您从不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

10-07 19:51