我是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
我该怎么做?
答案 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:withObject
和exchangeObjectAtIndex: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];