2010-02-05 63 views
3

我有一个令人困惑的问题 - 它似乎应该很容易做,但不知何故它不工作。我有一个叫做Player的对象。 Manager类有四个播放器实例:重新分配变量不起作用

@interface Manager 
{ 
    Player *p1, *p2, *mCurrentPlayer, *mCurrentOpponent; 
} 
// @property... 

Manager对象具有initPlayers和swapPlayers方法。

-(void) initPlayers { // this works fine 
    self.p1 = [[Player alloc] init]; 
    self.p2 = [[Player alloc] init]; 
    self.mCurrentPlayer = self.p1; 
    self.mCurrentOpponent = self.p2; 
} 

-(void) swapPlayers { // this swapping of pointer doesn't work 
    self.mCurrentPlayer = self.p2; 
    self.mCurrentOpponent = self.p1; 

    // When I look at the pointer in debugger, self.mCurrentPlayer is still self.p1. :-(

    // I even tried first setting them to nil, 
    // or first releasing them (with an extra retain on assignment) to no avail 
} 

我在想什么?提前致谢!

+4

你还可以从你的界面发布@property代码吗? – 2010-02-05 18:59:25

+0

@property(nonatomic,retain)Player * p1,* p1,* mCurrentPlayer,* mCurrentOpponent; – twinkle 2010-02-05 19:25:23

回答

3

不知道您的访问器是如何设置的,将难以按原样对代码进行故障排除。话虽这么说,这里是如何您存取和代码设置:

Manager.h

@interface Manager 
{ 
    Player *p1, *p2, *mCurrentPlayer, *mCurrentOpponent; 
} 
@property (nonatomic, retain) Player *p1; 
@property (nonatomic, retain) Player *p2; 
@property (nonatomic, assign) Player *mCurrentPlayer; 
@property (nonatomic, assign) Player *mCurrentOpponent; 
@end 

Manager.m

-(void) initPlayers { 
    self.p1 = [[[Player alloc] init] autorelease]; 
    self.p2 = [[[Player alloc] init] autorelease]; 
    self.mCurrentPlayer = self.p1; 
    self.mCurrentOpponent = self.p2; 
} 

-(void) swapPlayers { 
    Player * temp = self.mCurrentPlayer; 
    self.mCurrentPlayer = self.mCurrentOpponent; 
    self.mCurrentOpponent = temp; 
} 
0

事实证明这个问题在代码中无关,我误解了问题的症状!但为了讨论的缘故,为什么需要在多行上使用@property,并使用临时变量交换玩家(按照e.James的答案)?

+0

您应该发表此评论作为评论e.James答案。无论如何,你的代码不会交换玩家;它总是让p2成为当前的玩家,并且p1成为当前的对手。 – bbum 2010-02-05 21:44:05

+0

@ twinkle:我不确定将“@属性”声明组合到一行上。我从来没有这样做过,但它可能工作。 – 2010-02-06 00:20:44

+0

组合声明工作正常,但你显然不能同时分配和保留在同一行上。 :) – bbum 2010-02-06 00:34:09