Я пытаюсь создать простую iphone-приложение, и я играл с функциями, а недавно - делегатами. Я просто смущен в отношении управления памятью, потому что, по-видимому, «хороший код» приводит к сбою моего приложения с помощью exc_bad_access.сглаживание управления объектной памятью
У меня есть объект с двумя элементами данных и реализация пустая.
@implementation semester: NSObject{
NSInteger ID;
NSString *name;
}
тогда мой метод делегата:
- (void) receiveSemester:(semester *)newSemester {
[test setText:newSemester.name];
}
и вид, который используется как форма, которая имеет:
@interface addSemesterController : UIViewController {
id<ModalViewDelegate> delegate;
UITextField *txtName;
UILabel *prompt;
UIButton *ok;
UIButton *cancel;
}
все объекты выполнены свойства и синтезируется в файле приложения. Вот метод, который используется делегат:
- (IBAction) okClick:(id)sender{
// create semester object and return it
semester *created = [[semester alloc] init];
created.name = txtName.text;
[delegate receiveSemester:created];
[self dismissModalViewControllerAnimated:YES];
}
И мой метод dealloc выглядит следующим образом:
- (void)dealloc {
/*
[txtName dealloc];
[prompt dealloc];
[ok dealloc];
[cancel dealloc];
*/
[super dealloc];
}
С deallocs объектов, содержащихся в форме закомментирована, мое приложение работает нормально. Однако, когда я раскомментировать их, я получаю EXC_BAD_ACCESS ошибки в моем протоколе делегата:
// in main view controller
- (void) receiveSemester:(semester *)newSemester {
[test setText:newSemester.name];
// test is a UILabel
}
Я попробовал метод зомби, и это говорит о том, что этикетка вызывает выпущенный объект. Я не выпускаю свой объект семестра в контроллере формы, и даже если бы я был функцией делегата, вызывается перед освобождением этого представления.
Очевидно, что я не должен выпускать объекты в методе dealloc, я просто неясен в том, почему я не должен.
Снова, заблаговременно за помощь.
использование [txtName release]; [быстрый выпуск]; [ok release]; [отменить релиз]; вместо dealloc, и вы также можете работать с автоматическим подсчетом ARC ..... с ARC вам не нужно использовать dealloc, релиз, он автоматически освободит память ... и вы выберете его в начале при создании нового вы также можете изменить свой проект в ARC с помощью Edit. – TheTiger
Прошу прощения, я не могу найти вариант ARC, где он? – gamda
, когда вы создаете новый проект - и в окне, где вы указываете название своего проекта. Ниже приведен один вариант - «Использовать автоматический подсчет ссылок», просто установите этот флажок ... и затем нажмите следующий. – TheTiger