0

我想制作一个 GKSession 对象的副本,并按如下方式实现 copyWithZone:

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

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

尽管如此,我并没有获取初始对象的副本,而是对其进行引用。

我错过了什么……;

copyWithZone 的实现是复制 GKSession 对象的方法,或者不是?

提前致谢...!

4

1 回答 1

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;
} 
于 2012-05-01T19:16:00.740 回答