2012-06-06 3 views
-1

Я пытаюсь создать простую 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, я просто неясен в том, почему я не должен.

Снова, заблаговременно за помощь.

+0

использование [txtName release]; [быстрый выпуск]; [ok release]; [отменить релиз]; вместо dealloc, и вы также можете работать с автоматическим подсчетом ARC ..... с ARC вам не нужно использовать dealloc, релиз, он автоматически освободит память ... и вы выберете его в начале при создании нового вы также можете изменить свой проект в ARC с помощью Edit. – TheTiger

+0

Прошу прощения, я не могу найти вариант ARC, где он? – gamda

+0

, когда вы создаете новый проект - и в окне, где вы указываете название своего проекта. Ниже приведен один вариант - «Использовать автоматический подсчет ссылок», просто установите этот флажок ... и затем нажмите следующий. – TheTiger

ответ

2

Использование release освободить переменные вместо вызова dealloc на переменных, из-за этого у вас возникли проблемы -

- (void)dealloc { 

    [txtName release]; 
    [prompt release]; 
    [ok release]; 
    [cancel release]; 

    [super dealloc]; 
} 
+0

безупречный! релиз больше не приводит к сбою приложения. Тем не менее, я все еще неясен. В чем разница между dealloc и release? И все ли освобождает все, чтобы избежать утечек памяти? – gamda

+0

Прежде чем писать код, прочитайте документацию (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/ UID/20000994-BAJHFBGH). –

+0

@ gamda - вам необходимо проверить документацию по управлению базовой памятью - https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/ UID/20000994-BAJHFBGH – rishi

0

попробовать писать

[txtName release]; 
[prompt release]; 
[ok release]; 
[cancel release]; 

вместо dealloc и эти объекты будут высвобождены правильно

Смежные вопросы