Могу ли я скопировать экземпляр класса в другой экземпляр класса? - PullRequest
1 голос
/ 15 марта 2012

Я новичок в Objective-C, поэтому, возможно, я неправильно сформулировал это.Я создал класс «Сообщение» и создаю его экземпляр следующим образом:

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 для хранения нескольких экземпляров сообщения.Вы можете увидеть это в примере о доступе к содержимому.

Так что просто замена указателей дает мне ошибку: «Выражение не присваивается»

Я пробовал это (где allMsgs - этоМассив в синглтоне):

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 ]

5 голосов
/ 15 марта 2012

Первое, что вам нужно сделать, это убедиться, что ваше свойство allMsgs содержит экземпляр NSMutableArray. Тогда просто сделайте это:

[globData.allMsgs exchangeObjectAtIndex:0 withObjectAtIndex:1];
2 голосов
/ 15 марта 2012

Не уверен, если вы это имеете в виду, если вы хотите поменять экземпляры классов, которые уже были созданы, вам просто нужно поменять местами указатели на них. Вот как работает ваш псевдокод, но вам не нужно выделять init для tmpmsg.

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 забыл о методе обмена :) Обновил мой пример, чтобы использовать ваш более эффективный вызов.

0 голосов
/ 15 марта 2012

Вы можете добавить метод, который выполняет копирование.Вот пример:

@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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...