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) は、4 行目により変更されません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 に答える