目标c:设置对象属性;属性不更新

时间:2012-11-24 12:22:55

标签: iphone objective-c ios xcode ipad

哇。今天早上我完全精神失常,坚持这个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;

请帮助!!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Imme,以下几行似乎很奇怪:

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

实际上,你在数组中拥有什么,意味着proposalInfoArray。 你检查了你的物体吗?