#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 повторений. :/