Почему мой объект вне области видимости исчезнет, если я изменю значение объекта?

#iphone

#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] amp;amp; ![managedObjectContext save:amp;error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }

    NSLog(@"Select Object Amount Value (after save): %@", [selectedObject valueForKey:@"amount"]);
}
[super viewWillDisappear:animated];
}
  

По какой-то причине объект amount «выходит из области видимости», только если я изменяю его значение до достижения метода viewWillDisappear. Итак, например, я загружаю это представление и нажимаю назад, все хорошо. Но если я изменю значение суммы, а затем нажму назад, отладчик покажет, что сумма выходит за рамки. Я думаю, что объект освобождается до достижения метода viewWillDisappear, но я не уверен, что именно нужно делать. Я пробовал другие варианты (атомарный / неатомный, сохранить / назначить / скопировать), но я не уверен, что действительно понимаю все это, даже после прочтения о них. :/

Кроме того, selectedObject, accountBalance и другие объекты все еще находятся в области видимости, даже если они имеют одинаковые атрибуты свойства. Приветствуется любая помощь. Спасибо. Дайте мне знать, если я смогу предоставить вам больше информации.

Комментарии:

1. Было бы полезно, если бы вы добавили больше информации, например, все строки кода, которые выполняют действия с «количеством»

Ответ №1:

Вы правы. Может быть, что amount освобождается при изменении его значения. Когда вы устанавливаете новое значение для amount , его предыдущий владелец может освободить его. Но, если вы устанавливаете новое значение непосредственно в переменную экземпляра, вы не сохраняете его.

Чтобы фактически использовать установщики и получатели, которые синтезированы в соответствии с вашими правилами свойств (т. Е. сохранить и т.д.), Вы должны Получить к ним доступ следующим образом:

 self.amount
self.amount = newValue;
  

Вы обходите синтезированные установщики и получатели, если вы обращаетесь к переменным экземпляра напрямую, следующим образом:

 amount
amount = newValue;
  

Если вы всегда используете self.amount вместо amount для ссылки на переменную вашего экземпляра, вы можете избавить себя от многих проблем.

Комментарии:

1. Это было оно! Большое спасибо. Я всегда пытаюсь разобраться во всем самостоятельно, прежде чем публиковать очередной глупый вопрос на форуме, но я рвал на себе волосы из-за этого. Еще раз спасибо. Я знаю, что всегда учился обращаться к глобальным переменным таким образом, но, думаю, эта практика просто вылетела у меня из головы :/

2. @CharileMezak : 😉 Спасибо за положительный отзыв и доброе слово

3. я не могу, у меня нет 15 повторений. :/