0

请纠正我,我错了(我是初学者)我想将一个类对象存储到 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);
        }
4

5 回答 5

3

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

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

mscObj.something = @"somethingelse";

在这里,您正在更改所引用对象的something 属性mscObj,但您并没有更改mscObj. 这改变数组中对象的内容,因为它mscObj指向的是同一个对象。

于 2012-04-17T13:10:29.920 回答
1

尝试:

[myarr addObject:[[mscObj copy] autorelease]];
于 2012-04-17T13:00:41.463 回答
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答案以获取帮助。

于 2012-04-17T13:07:04.383 回答
0

这是因为指针。您在 index:0 处的对象仍然在内存中的同一位置。它总是会改变。

添加数组后尝试重新释放 mscObj 并使用 @"somethingelse" 创建一个新的 MySimpleClass 对象

于 2012-04-17T13:01:53.553 回答
0

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

于 2012-04-17T13:03:04.637 回答