如果我更改对象的值,为什么我的对象在viewWillDisappear中超出范围?

时间:2011-05-06 20:56:18

标签: iphone

所以我有这个课程:

@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和其他对象仍在范围内。任何帮助表示赞赏。谢谢。如果我能为您提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

你是对的。可能是amount在您更改其值时被释放。当您为amount设置新值时,其之前的所有者可能会将其释放。但是,如果要将新值直接设置为实例变量,则不会保留它。

要实际使用根据您的属性规则(即保留等)合成的setter和getter,您必须按如下方式访问它们:

self.amount
self.amount = newValue;

如果直接访问实例变量,则绕过合成的setter和getter,如下所示:

amount
amount = newValue;

如果您总是使用self.amount而不是amount来引用您的实例变量,那么您可以省去很多麻烦。