实现copyWithZone的GKSession对象的副本

时间:2012-05-01 18:48:32

标签: objective-c memory-management copywithzone

我想复制一个GKSession对象,并按照以下方式实现copyWithZone:

-(id)copyWithZone:(NSZone *)zone {

GKSession *kati = [[GKSession allocWithZone: zone] init];
kati=_currentSession;    
return kati;}    

尽管如此,我并没有把初始对象的副本作为参考。

我错过了什么......;

copyWithZone的实现是否可以复制GKSession对象?

提前致谢......!

1 个答案:

答案 0 :(得分:0)

让我们来看看你的代码在做什么:

GKSession *kati = [[GKSession allocWithZone: zone] init];

您分配一个新的GKSession对象,并更新kati变量以指向该对象。

kati=_currentSession;  

您将kati变量更改为指向另一个对象。这意味着您刚刚分配的对象被泄露;你没有指向它的指针,但它还没有被释放。

return kati;

返回kati变量的值,该变量是指向_currentSession对象的指针。

这显然不是你想要的。您想要创建一个与GKSession具有相同基础信息的新_currentSession,对吧?在那种情况下,我会从:

开始
- (id)copyWithZone:(NSZone *)zone {
  NSString *sessionID = [_currentSession sessionID];
  NSString *name = [_currentSession displayName];
  GKSessionMode sessionMode = [_currentSession sessionMode];
  GKSession *kati = [[GKSession alloc] initWithSessionID:sessionID displayName:name sessionMode:mode]; 
  return kati;
}