我可以将Class的实例复制到另一个Class实例吗?

时间:2012-03-14 20:14:52

标签: objective-c

我是Objective-C的新手,所以我可能会错误地说这个。 我已经创建了一个Class“Message”,我将它实例化为:

Message *newmsg=[[Message alloc]init];

当我访问newmsg的内容时,我这样做(例如):

NSString *junk=((Message *)[globDat.allMsgs objectAtIndex:i]).text

我想交换两个实例的内容。特别是因为班上有多个项目。 例如,这个想法就是这个(伪代码)

Message *TopMsg=[[Message alloc]init];
Message *BottomMsg=[[Message alloc]init];
Message *tmpmsg=[[Message alloc]init];
...
//enter values for TopMsg.xyz and BottomMsg.xyz
....
//swap
tmpmsg=TopMsg;
TopMsg=BottomMsg;
BottomMsg=tmpmsg;
编辑:我忽略了在Singleton中使用数组来保存多个Message实例。您可以在示例中看到有关访问内容的信息。

所以只需交换指针就会给我一个错误:“表达式不可分配”

我试过这个(其中allMsgs是Singleton中的数组):

GlobalData *globDat=[GlobalData getSingleton];
Message *newmsg=[[Message alloc]init];
newmsg=[globDat.allMsgs objectAtIndex:0];
[globDat.allMsgs objectAtIndex:0]=[globDat.allMsgs objectAtIndex:1]; //<--ERROR

和此:

GlobalData *globDat=[GlobalData getSingleton];
Message *newmsg=[[Message alloc]init];
newmsg=[globDat.allMsgs objectAtIndex:0];
(Message *)[globDat.allMsgs objectAtIndex:0]=(Message *)[globDat.allMsgs objectAtIndex:1]; //<--ERROR

我该怎么做?

3 个答案:

答案 0 :(得分:5)

您需要做的第一件事是确保您的allMsgs属性包含NSMutableArray的实例。然后只需这样做:

[globData.allMsgs exchangeObjectAtIndex:0 withObjectAtIndex:1];

答案 1 :(得分:2)

不确定这是不是你的意思,如果你想交换已经创建的类实例,你只需要将指针交换它们即可。这是你的伪代码的工作方式,但你不需要为tmpmsg分配init。

Message *TopMsg=[[Message alloc]init];
Message *BottomMsg=[[Message alloc]init];
Message *tmpMsg=nil;
...
// Set values in topmsg and bottommsg
...

tmpMsg=TopMsg;
TopMsg=BottomMsg;
BottomMsg=tmpmsg;

如果要复制消息,则必须为该类编写复制方法。

编辑后

看起来您正在更改数组中的对象。它需要是一个NSMutableArray。

使用insertObject:atIndex:removeObjectatIndex:replaceObjectAtIndex:withObjectexchangeObjectAtIndex:withObjectAtIndex来操纵它。

这将交换索引0和1

中的消息
GlobalData *globDat=[GlobalData getSingleton];
[globDat.allMsgs exchangeObjectAtIndex:0 withObjectAtIndex:1]

@jlehr忘记了交换方法:)更新了我的示例以使用更有效的呼叫。

答案 2 :(得分:0)

您可能想要添加执行副本的方法。这是一个例子:

@interface Message
@property (nonatomic, copy) NSString *x;
@property (nonatomic, copy) NSString *y;
@property (nonatomic, copy) NSString *z;
@end

@implementation Message
@synthesize x;
@synthesize y;
@synthesize z;
-(void)copyFrom:(Message *)message
{
   self.x = message.x;
   self.y = message.y;
   self.z = message.z;
}
-(void)dealloc
{
  self.x = nil;
  self.y = nil;
  self.z = nil;
  [super dealloc];
}
@end

你的例子:

Message *TopMsg=[[Message alloc]init];
Message *BottomMsg=[[Message alloc]init];
Message *tmpmsg=[[Message alloc]init];

TopMsg.x = @"Foo1";
TopMsg.y = @"Bar1";
TopMsg.z = @"Boo1";

BottomMsg.x = @"Foo2";
BottomMsg.y = @"Bar2";
BottomMsg.z = @"Boo2";

[tmpmsg copyFrom:TopMsg];
[TopMsg copyFrom:BottomMsg];
[BottomMsg copyFrom:tmpmsg];