2012-04-17 2 views
0

Пожалуйста, исправьте меня, где я ошибаюсь (я начинаю) Я хочу сохранить объекты класса в NSArray. Например:Сохраните объект в NSMutableArray

MySimpleClass *mscObj = [[MySimpleClass alloc] initWithSomething:@"something"]; 
NSMutableArray *myarr = [[NSMutableArray alloc] init]; 
[myarr addObject:mscObj]; 
mscObj = @"somethingelse"; 

И вот мой индекс myarr 0 изменится с @ "something" на @ "somethingelse". Зачем? Могу ли я хранить копию только для массива?

EDIT: В MySimpleClass:

#import <Foundation/Foundation.h> 

@interface MySimpleClass : NSObject { 
} 

@property (strong,nonatomic) NSString *objectName; 
@property (strong,nonatomic) NSString *objectTarget; 

-(void)addName:(NSString*)name; 
-(void)addTarget:(NSString*)target; 


@end 

.m файл

#import "MySimpleClass.h" 

@implementation MySimpleClass 

@synthesize objectName; 
@synthesize objectTarget; 

-(void)addName:(NSString*)name{ 
    self.objectName = name; 
} 

-(void)addTarget:(NSString*)target{ 
    self.objectTarget = target; 
} 

-(void)flushAll { 
    self.objectTarget = nil; 
    self.objectName = nil; 
} 

@end 

Тогда в другом классе у меня есть:

MySimpleClass *mscObj = [[MySimpleClass alloc] initWithSomething:@"something"]; 


[myarr addObject:[mscObj copy]]; 

     int testunit = [myarr count]; 
     for(int i=0;i<testunit;i++) { 
      MySimpleClass *myelement = [myarr objectAtIndex:i]; 
      NSLog(@"%@ : %@",myelement.objectName,myelement.objectTarget); 
     } 
+0

u изменил значение mscObj и NSArray сохранил только подтверждение объекта. ur myarr index 0 ссылаются на тот же объект, где значение объекта было изменено. если u хочет, чтобы индекс ur в 0 должен был иметь «что-то», а при индексе на 1 он должен быть «что-то», тогда вам нужно сохранить копию объекта в индексе 0, а затем добавить обновленную копию mscObj в индекс 1 с помощью метода addObject: – dayitv89

ответ

1

Try:

[myarr addObject:[[mscObj copy] autorelease]]; 
+0

После этого я получаю сообщение об ошибке: [mscObj copyWithZone:]: непризнанный селектор, отправленный в экземпляр. Должен ли я писать копию метода в моем классе? Но что я должен там положить? – Kuba

+0

Не нужно писать какие-либо методы, приведенный выше код должен работать нормально. Где вы размещаете свой код? Является ли ваш объект объектом Core-Data? – sooper

+0

Я добавлю код на мой вопрос, спасибо. – Kuba

0

Это из-за указателей. Ваш объект по индексу: 0 остается в том же месте в памяти. Он всегда будет меняться.

попробовать releagind в mscObj после добавления массива и создать новый объект MySimpleClass с @ «somethingelse»

0

mscObj является ссылкой, и что хранит массив являются ссылки. Поэтому, если вы манипулируете объектом извне контейнера, ссылка отражает изменения. Поразмыслите о значении по значению.

1

Когда вы сделаете это

[myarr addObject:mscObj]; 

myarr является сохранение ссылки на mscObj. Таким образом, в любое время mscObj изменяется, myarr будет отражать это изменение.

Когда вы сделаете это

[myarr addObject:[mscObj copy]]; // I've left the autorelease out for simplicity 

myarr сохраняет ссылку на новую копию mscObj. Когда mscObj затем обновляется, myarr не будет отражать изменение, потому что это указывает на совершенно другой объект.

EDIT

Для копирования работать ваш класс ** MySimpleClass ** необходимо для реализации NSCopying. См. Этот ответ SO для получения справки.

+0

Как я сказал ниже: После этого я получаю сообщение об ошибке: [mscObj copyWithZone:]: непризнанный селектор, отправленный в экземпляр. Должен ли я писать копию метода в моем классе? Но что я должен там положить? – Kuba

+1

Для правильной работы копии вам необходимо искать ** NSCopying ** - это протокол ** MySimpleClass ** необходимо реализовать для вызовов методов, таких как ** copy **, для работы. – Damo

+0

Я добавляю это, теперь, компилируем без ошибок, но все же у меня нет копии экземпляра в моем массиве. Так что проблема все еще существует. – Kuba

3

Учитывая код, который вы опубликовали, первый объект (индекс 0) в массиве не изменится из-за четвертой строки, mscObj = @"something else";. Эта строка меняет значение самого указателя mscObj, так что оно будет указывать на совершенно другой объект. Если объект в массиве меняется, я считаю, что реальный код, который вы используете, не совсем соответствует тому, что вы разместили, - пожалуйста, проверьте это.

Однако, если вы используете mscObj указатель для изменения атрибут объекта, который он указывает, то вы изменили объект в массиве:

mscObj.something = @"somethingelse"; 

Здесь вы меняющегося somethingобъект объекта, на который ссылается mscObj, но вы не меняете значение mscObj. Это будет изменить содержимое объекта в массиве, так как это тот же объект, на который указывает mscObj.

+0

Да, вы правы, Извините, я не думаю, что это что-то другое. Я добавляю код в свой первоначальный вопрос. Благодарю. – Kuba

Смежные вопросы