有关对象释放的问题

时间:2010-12-05 09:07:17

标签: iphone objective-c cocoa-touch

以下代码来自Apple的GKRocket iPhone演示应用程序:

- (void) peerListDidChange:(SessionManager *)session;
{
    NSArray *tempList = peerList;
    peerList = [session.peerList copy];
    [tempList release];
    [self.tableView reloadData]; 
}

我是目标c的新手,想知道 tempList 是否真的需要发布?我的直觉并告诉我不是因为它没有保留指针。也许我没有看到整体情况。

如果需要发布,有经验的人可以解释一下原因吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

只是一个猜测。我之前没有使用过该示例项目。

创建了一个指向旧peerList数组的新指针,称为tempList

NSArray *tempList = peerList;

代码复制session.peerList并将peerList指针指向该新副本:

peerList = [session.peerList copy];

peerList实际上现在指向的旧tempList可以安全释放:

[tempList release];

如果您已立即分配[session.peerList copy];,则旧数组将不再保留指针,如果未自动释放,则会出现内存泄漏。

如果你已经分配tempList但没有释放它,它会因为同样的原因而泄漏内存,但tempList的目的纯粹是因为程序知道在你调用{{1}时要释放什么无论如何。

答案 1 :(得分:0)

此项目的最新版本实际上在代码中崩溃了。 session.peerList是NSMutableArray - 当应用程序尝试将其分配给tempList时应用程序崩溃。我修改了代码来阻止崩溃。这是peerList的声明:

@interface GameLobbyController : UITableViewController <UITableViewDelegate, UITableViewDataSource, SessionManagerLobbyDelegate, UIAlertViewDelegate> {
NSMutableArray  *peerList;
UIAlertView *alertView;
SessionManager *manager;}

这是peerListDidChange方法的新版本:

- (void) peerListDidChange:(SessionManager *)session;{
peerList = session.peerList;
[self.tableView reloadData];}

不确定,但我认为所有tempList代码只是处理从可变数组到固定数组的转换。显然我不明白为什么修复peerList属性是如此重要而不是可变。欢迎所有评论。