iPhone - Objective-C - утечка памяти с initWithArray - PullRequest
0 голосов
/ 13 февраля 2011

Я использую код ниже для установки двух NSArray иваров:

Проблема в том, что я получаю утечку памяти в следующих строках:

followingFriendsArray = [[NSArray alloc] initWithArray:friend.Following];
followerFriendsArray = [[NSArray alloc] initWithArray:friend.Followers];

Разве это не правильный способ установки иваров из существующих NSArray предметов? Любая помощь будет оценена. Я также пытался autorelease вышеупомянутые две строки, но когда я на самом деле обращаюсь к ним другим способом, я получаю сообщение об ошибке, что они уже были освобождены.

Я включил мой код интерфейса и реализации ниже:

Интерфейс .h:

NSArray *followingFriendsArray;
NSArray *followerFriendsArray;

@property (nonatomic, retain) NSArray *followingFriendsArray;
@property (nonatomic, retain) NSArray *followerFriendsArray;

Реализация .m:

- (void)handlerGetFollowingInformation:(id)value {
    BOOL success = [Utility checkWebServiceErrors:value controller:self.navigationController];

    if (success) {
        Friend *friend = (Friend *)value;

        followingFriendsArray = [[NSArray alloc] initWithArray:friend.Following];
        followerFriendsArray = [[NSArray alloc] initWithArray:friend.Followers];
    }
}

Вот как мне нужно получить доступ к массивам:

- (void)followersButtonTapped:(id)sender {
    FollowingVC *fvc = [[FollowingVC alloc] initWithNibName:@"FollowingViewController" bundle:nil];

    fvc.friends = followerFriendsArray;

    [self.navigationController pushViewController:fvc animated:YES];
    [fvc release];
}

Я выпускаю два своих ивара следующим образом:

- (void)viewDidUnload {
    self.followingFriendsArray = nil;
    self.followerFriendsArray = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    [followingFriendsArray release];
    [followerFriendsArray release];
    [super dealloc];
}

Я имею в виду, что код работает просто отлично, просто меня беспокоит утечка памяти при запуске инструмента производительности «Утечки».

Ответы [ 3 ]

3 голосов
/ 13 февраля 2011

Ваш метод handlerGetFollowingInformation назначает новые значения followingFriendsArray и followerFriendsArray, не освобождая предыдущее содержимое.Если вы вызываете этот метод более одного раза для одного и того же экземпляра, у вас будет утечка.

3 голосов
/ 13 февраля 2011

OK

в этом случае вы не должны использовать авто-релиз, но вы должны освободить массивы, позвонив по телефону:

[followingFriendsArray release];
[followerFriendsArray release];

, вы можете сделать это:

  1. когда вам больше не нужно их использовать.
  2. в методе dealloc в вашем файле .m.

опция 2 выглядит так -

- (void)dealloc {
[followingFriendsArray release];
[followerFriendsArray release];
[super dealloc];
}

Кстати - если вы не манипулируете массивами после их создания (добавление / удаление объектов), вам следует использовать неизменяемый массив (NSArray).Удачи

1 голос
/ 13 февраля 2011

CRD правильно, что массивы не освобождаются внутри метода handlerGeFollowingInformation, но исправление может быть излишним. Вам нужно использовать self. , чтобы вызывался метод setter, который делает это автоматически. Вы могли бы выглядеть так:

- (void)handlerGetFollowingInformation:(id)value {
    BOOL success = [Utility checkWebServiceErrors:value controller:self.navigationController];

    if (success) {
        Friend *friend = (Friend *)value;

        self.followingFriendsArray = [[NSArray alloc] initWithArray:friend.Following];
        self.followerFriendsArray = [[NSArray alloc] initWithArray:friend.Followers];
    }
}

Простое исправление, но его трудно обнаружить, и я снова и снова сталкивался с этой проблемой, особенно когда я начал задавать свойства.

-Andy

...