将对象存储到NSMutableArray中

时间:2012-04-17 12:57:51

标签: iphone objective-c ios nsmutablearray nsarray

拜托,纠正我,我错了(我是个乞丐) 我想将一个类对象存储到NSArray中。例如:

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

然后我的myarr指数0从@“something”变为@“somethingelse”。为什么?我可以只将副本存储到数组吗?

编辑: 在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);
        }

5 个答案:

答案 0 :(得分:3)

根据您发布的代码,由于第四行mscObj = @"something else";,数组中的第一个对象(索引0)不会更改。该行改变了指针mscObj本身的值,因此它将指向一个完全不同的对象。如果数组中的对象发生了变化,我相信您使用的真实代码与您发布的内容不完全匹配 - 请检查一下。

但是,如果您使用mscObj指针来更改它指向的对象的属性,那么您将更改数组中的对象:

mscObj.something = @"somethingelse";

您要更改something引用的对象的mscObj 属性,但您不会更改mscObj的值。这个更改数组中对象的内容,因为它与mscObj指向的对象相同。

答案 1 :(得分:1)

尝试:

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

答案 2 :(得分:1)

当你这样做时

[myarr addObject:mscObj];

myarr保留对mscObj的引用。因此,只要mscObj被改变,myarr就会反映出这种变化。

当你这样做时

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

myarr保留对mscObj新副本的引用。当mscObj被更新后,myarr将不会反映更改,因为它的引用指向一个完全不同的对象。

修改

要使复制工作,你的班级** MySimpleClass **需要实现NSCopying。请参阅此SO答案以获取相关帮助。

答案 3 :(得分:0)

这是因为指针。索引处的对象:0保留在内存中的相同位置。它将始终更改。

尝试在添加数组后重新绑定mscObj并使用@&#34; somethingelse&#34;

创建一个新的MySimpleClass对象

答案 4 :(得分:0)

mscObj是一个引用,数组存储的是引用。因此,如果您从容器外部操纵对象,则引用会反映更改。考虑参考差异的值。