2012-02-05 3 views
1

Мое приложение получает предупреждения о памяти, потому что просит много памяти. Я пытаюсь выпустить каждое выделение. Однако иногда я не знаю, как это сделать.ios alloc-release

Например: У меня есть две пары файлов .h и .m. Один из них устанавливает соединения с сервером, а другой - с локальным SQLite.

Обычно код, который вызывает к способу из этих файлов, как это:

-(NSMutableArray *) getRecentActivity{ 
    LocalStorageController *local = [[LocalStorageController alloc]init]; 
    return [local getRecentActivity]; 
} 

getRecentActivity возвращает NSMutableArray.

Ну, в этом фрагменте кода мы видим, что я выделяю память для LocalStorageController, но я никогда не вызываю метод release, поэтому, я полагаю, чем больше я вызываю эту функцию, тем больше памяти я буду выделять.

Если я вызываю autorelease после init, он сработает.

Кроме того, как правило, я использую этот другой вид кода:

ServerConnection *serv = [[ServerConnection alloc]init]; 
    NSMutableArray list = [serv getMyListOfContacts]; 

который использует ASIHTTPRequest и, если я позвоню [serv release]; после второй линии, сбои приложений с EXC_BAD_ACCESS указывая на линию в библиотеке ASIHTTPRequest.

Как можно управлять этой ситуацией?

спасибо!

+0

Вы используете ARC? –

+0

Нет, я не использую ARC – Ibai

ответ

2

Первый случай прост;

-(NSMutableArray *) getRecentActivity{ 
    LocalStorageController *local = [[LocalStorageController alloc]init]; 
    NSMutableArray *tmp = [local getRecentActivity]; 
    [local release]; 
    return tmp; 
} 

Второй случай трудно решить в общем виде, не видя больше фактического кода.

+2

Вам также нужно сохранить на 'tmp', а затем вернуть его' autorelease'd. Вы не можете предположить, что 'tmp' действует после' [local release] ', если вы этого не сделаете. – mattjgalloway

0

Использование сервиса как свойства будет фиксировать эту проблему сохранения/освобождения.

В вашем .h:

@property (nonatomic, retain) ServerConnection *server; 

В вашем .m:

@synthesize server; 

- (void)dealloc { 
    [server release]; 
    // The rest of your releases here... 
    [super dealloc]; 
} 

- (void)yourMethod { 
    ServerConnection *myServConnection = [[ServerConnection alloc] init]; 
    self.serv = myServConnection; 
    [myServConnection release]; 
    NSMutableArray list = [self.serv getMyListOfContacts]; 
} 

Просто держать на использовании self.serv в этом классе с этого момента, и вы не будете иметь проблему с выпуском объекта.

+1

Вы забыли '[super dealloc]' – Abizern

+0

Я просто показывал, где код идет для выпуска, но вы правы. Я обновил свой ответ. Спасибо что подметил это! –

+0

Отредактируйте его снова, вы должны поместить вызов super dealloc внизу. – Till

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