哇。今天早上我完全精神崩溃了这个 101 问题。
在 ViewController
中,我有这段代码。但是执行后,[proposalInfo expanded]
的值仍然是NO。有人可以看到我做错了什么吗?
- (void)showFullProposal:(id) sender {
// update proposalinfo
ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:index.section];
[proposalInfo setExpanded:YES];
}
变量声明如下:
View Controller :
@interface ViewController()
@property (nonatomic, strong) NSMutableArray* proposalInfoArray;
@end
提案信息.h:
@interface ProposalInfo : NSObject
@property (assign) BOOL expanded;
@end
提案信息.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
!
关于iphone - objective-c : setting an object attribute ; attribute not updating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541155/