Iphone 目标c:设置对象属性;属性未更新
哇。今天早上,我在这个101问题上完全精神失常了 在Iphone 目标c:设置对象属性;属性未更新,iphone,objective-c,ios,xcode,ipad,Iphone,Objective C,Ios,Xcode,Ipad,哇。今天早上,我在这个101问题上完全精神失常了 在ViewController中,我有这个代码。但是在它执行之后,[proposalInfo expanded]的值仍然是NO。有人能看出我做错了什么吗 - (void)showFullProposal:(id) sender { // update proposalinfo ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:index.section]; [p
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
建议信息h:
@interface ProposalInfo : NSObject
@property (assign) BOOL expanded;
@end
ProposalInfo.m:
@synthesize expanded;
请帮忙 Imme,下面这行似乎很奇怪:
ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:index.section];
实际上,你的数组中有什么,在proposalinforary
中是什么意思。
你检查过你的物品了吗?伊米,下面这行看起来很奇怪:
ProposalInfo *proposalInfo = [self.proposalInfoArray objectAtIndex:index.section];
实际上,你的数组中有什么,在proposalinforary
中是什么意思。
你检查过你的对象吗?如果你从来没有
alloc
/init
你的proposalInfoArray
数组,你可能会经历这样的行为(即没有错误,但总是得到no
返回,因为当你向nil
对象发送消息时,你会得到nil
返回)。如果不是这样的话,那就简单点。检查ProposalinforArray
,确保它不是nil
。还要检查您返回的proposalInfo
对象,确保它不是nil
为了说明您可能遇到的问题,这将再现您描述的行为(例如,expanded
看起来像是NO
,但您仍然没有得到任何异常):
鉴于此项工作正常:
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
。如果不是这样的话,那就简单点。检查ProposalinforArray
,确保它不是nil
。还要检查您返回的proposalInfo
对象,确保它不是nil
为了说明您可能遇到的问题,这将再现您描述的行为(例如,expanded
看起来像是NO
,但您仍然没有得到任何异常):
鉴于此项工作正常:
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
proposalinfo中的setExpanded:
方法如何?@I'MPOSSIBLE将合成setExpanded:
方法。@I'MPOSSIBLE由于属性已合成,因此不需要显式的setExpanded方法。proposalinfo中的setExpanded:
方法如何?@I'MPOSSIBLEsetExpanded:
方法已合成。@我不可能,因为属性已合成,所以不需要显式的setExpanded方法。我怀疑您关于ProposalinforArray
的说法是正确的,但我不确定您觉得这行代码有什么奇怪之处。我假设Imme有一个tableview,每个提案有一个部分,并且可能试图跟踪该部分是否被扩展。Rob,实际上我感到奇怪的是Imme试图用这个来辅助他的“proposalInfo”对象,重点是数组是否有这样的对象,如果是,那么它是保留还是不保留。更重要的是,可能根据我的想法,这个物体正在制造那个问题;一旦imme向我大喊这个对象,那么只有我才能思考其他方面,因为几秒钟前我尝试在我的示例代码中使用它,它提供了imme想要的。这个构造绝对没有问题。这是一种非常常见的模式,设置一些局部指针变量以指向数组中的对象。当然,在该循环的作用域中,对象有一个额外的强引用,但只要proposalInfo
指针超出作用域或设置为其他对象,它就会被解析。唯一有点危险的是缺少iskind
逻辑(但如果他得到了错误类型的对象,就会引发异常,所以这不是问题),但这种总体模式一点也不奇怪。感谢您在这方面的投入。我怀疑您对proposalInfoArray
的看法是正确的,但我不确定你觉得这行代码有什么奇怪之处。我假设Imme有一个tableview,每个提案有一个部分,并且可能试图跟踪该部分是否被扩展。Rob,实际上我感到奇怪的是Imme试图用这个来辅助他的“proposalInfo”对象,重点是数组是否有这样的对象,如果是,那么它是保留还是不保留。更重要的是,可能根据我的想法,这个物体正在制造那个问题;一旦我对这个物体大喊大叫,那么只有我能想到其他方面,因为几秒钟前我试着用这个