哇。今天早上,我完全陷入了这个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
!