iPhone - Objective-C - 使用initWithArray进行内存泄漏

时间:2011-02-13 03:03:46

标签: iphone objective-c arrays nsmutablearray autorelease

我使用下面的代码来设置我的两个NSArray ivars:

问题是,我在以下几行中不断收到内存泄漏:

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

这不是从现有NSArray项目中设置ivars的正确方法吗?任何帮助,将不胜感激。我也试过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 个答案:

答案 0 :(得分:3)

在这种情况下你不应该使用autorelease,但你必须通过调用:

来释放数组
[followingFriendsArray release];
[followerFriendsArray release];

你可以做到:

  1. 当您不再需要使用它们时。
  2. 在.m文件中的dealloc方法。
  3. 选项2看起来像那样 -

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

    BTW - 如果在创建数组后没有操作数组(添加/删除对象),则应使用不可变数组(NSArray)。 祝你好运

答案 1 :(得分:3)

您的方法handlerGetFollowingInformation正在为followingFriendsArrayfollowerFriendsArray分配新值而不释放之前的内容。如果您在同一个实例上多次调用此方法,则会泄漏。

答案 2 :(得分:1)

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];
    }
}

轻松修复但很难发现,我一遍又一遍地遇到这个问题,特别是当我开始dealloc属性时。

-Andy