我使用下面的代码来设置我的两个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];
}
我的意思是代码运行得很好,只是当我运行“泄漏”性能工具时我担心内存泄漏。
答案 0 :(得分:3)
行
在这种情况下你不应该使用autorelease,但你必须通过调用:
来释放数组[followingFriendsArray release];
[followerFriendsArray release];
你可以做到:
选项2看起来像那样 -
- (void)dealloc {
[followingFriendsArray release];
[followerFriendsArray release];
[super dealloc];
}
BTW - 如果在创建数组后没有操作数组(添加/删除对象),则应使用不可变数组(NSArray)。 祝你好运
答案 1 :(得分:3)
您的方法handlerGetFollowingInformation
正在为followingFriendsArray
和followerFriendsArray
分配新值而不释放之前的内容。如果您在同一个实例上多次调用此方法,则会泄漏。
答案 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