所以我有这个课程:
@interface AmountViewController : UITableViewController <UITableViewDelegate, UITextFieldDelegate>{
NSManagedObjectContext *managedObjectContext;
NSManagedObject *selectedObject;
NSDecimalNumber *amount;
NSDecimalNumber *accountBalance;
NSInteger textFieldRow;
}
- (void)textFieldDone:(id)sender;
- (NSDecimalNumber *)absoluteValue:(NSDecimalNumber *)number;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSManagedObject *selectedObject;
@property (nonatomic, retain) NSDecimalNumber *amount;
@property (nonatomic, retain) NSDecimalNumber *accountBalance;
@property NSInteger textFieldRow;
@end
现在在我的实施中
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"Select Object Amount Value: %@", [selectedObject valueForKey:@"amount"]);
if (amount != nil) //amount is out of scope, has something to do with retain, but accountBalance is in scope. ???
{
NSLog(@"Textfield Amount: %@", amount);
//TODO: save changes to amount
//[selectedObject setValue:amount forKey:@"amount"];
NSError *error = nil;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
NSLog(@"Select Object Amount Value (after save): %@", [selectedObject valueForKey:@"amount"]);
}
[super viewWillDisappear:animated];
}
由于某种原因,只有在我到达viewWillDisappear方法之前修改其值时,amount对象才会“超出范围”。例如,我加载此视图并按回,一切都很好。但是,如果我更改金额值然后按回,调试器会显示金额超出范围。我的想法是,在到达viewWillDisappear方法之前,对象已经被释放,但我不确定究竟要做什么。我尝试过(原子/非音乐,保留/分配/复制)的其他变体,但我不确定即使在阅读了它们之后我也真正理解了所有这些。 :/
此外,即使具有相同的属性属性,selectedObject,accountBalance和其他对象仍在范围内。任何帮助表示赞赏。谢谢。如果我能为您提供更多信息,请告诉我。
答案 0 :(得分:2)
amount
在您更改其值时被释放。当您为amount
设置新值时,其之前的所有者可能会将其释放。但是,如果要将新值直接设置为实例变量,则不会保留它。
要实际使用根据您的属性规则(即保留等)合成的setter和getter,您必须按如下方式访问它们:
self.amount
self.amount = newValue;
如果直接访问实例变量,则绕过合成的setter和getter,如下所示:
amount
amount = newValue;
如果您总是使用self.amount
而不是amount
来引用您的实例变量,那么您可以省去很多麻烦。