ios alloc-release - PullRequest
       27

ios alloc-release

1 голос
/ 05 февраля 2012

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

Например: у меня есть две пары файлов .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.

Как предполагается управлять этой ситуацией?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

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

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

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

0 голосов
/ 06 февраля 2012

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

В вашем .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 в этом классе с этого момента, и у вас не будет проблем с выпуском объекта.

...