以下代码来自Apple的GKRocket iPhone演示应用程序:
- (void) peerListDidChange:(SessionManager *)session;
{
NSArray *tempList = peerList;
peerList = [session.peerList copy];
[tempList release];
[self.tableView reloadData];
}
我是目标c的新手,想知道 tempList 是否真的需要发布?我的直觉并告诉我不是因为它没有保留指针。也许我没有看到整体情况。
如果需要发布,有经验的人可以解释一下原因吗?
谢谢!
答案 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属性是如此重要而不是可变。欢迎所有评论。