2012-04-15 9 views
1

を渡された場合の試みを設定しようとする別のクラスの内部でメソッドを使用するように作られている場合にNSArrayのみクラスは

#import <Foundation/Foundation.h> 
@interface MyClass : NSObject 
property(nonatomic, strong) (NSArray *) myArray; 
@end 

#import "MyClass.h" 
@implementation MyClass 
@synthesize myArray = _myArray; 
@end 

...私は空想何もARCを使用してNSArrayのプロパティを持つクラスを持って変更その配列だけが渡された場合は設定されません。つまり、なぜしかし、それは、この両方の方法を試みるコードは、私はいくつかの他のを試してみまし以下...

MyClass *myClass = [[MyClass alloc] init]; 
[self setArrayByPassingArray:myClass.myArray]; 
NSLog (@"%@", myClass.myArray) 
//result is null 

[self setArrayByPassingClass:myClass]; 
NSLog (@"%@", myClass.myArray) 
//result is test, test2... 

-(void)setArrayByPassingArray:(NSArray *)arrayToSet { 
arrrayToSet = [[NSArray alloc] initWithObjects: @"test", @"test2", nil]; 
} 

-(void)setArrayByPassingClass:(MyClass *)classWithArrayToSet { 
classWithArrayToSet.myArray = = [[NSArray alloc] initWithObjects: @"test", @"test2", nil]; 
} 

です....クラスが渡された場合、私はわからないんだけど

を設定しません

答えて

1

最初の例ではあなたのsetArrayByPassingArray:方法は、新たにそのパラメータにNSArray作成割り当て...ただの文字列と文字列を持つメソッドは変更されませんので、それらを含むクラスが渡された場合、彼らが変更された理由を私はわかりませんであり、に値に記載されており、メソッドを終了すると速やかに破棄されます。ここではmyArrayへの参照のコピーが作成されます(配列のコピーではなく、その配列への参照のコピーのみ)。setArrayByPassingArray:を呼び出す前に起こります。そのコピーは、MyClassmyArrayメンバにはもう添付されません。それは、インスタンスクラスのを渡していますし、それが正しく、インスタンスにmyArrayプロパティを割り当てるには、ドット表記を使用しています -

あなたの第二の例では、クラスを渡していません。それでこの2番目の例はうまくいき、最初の例ではそうではありません。

あなたがプログラム全体NSMutableArrayの代わりNSArrayを使用している場合、あなたはそれを動作させるためにあなたの最初の例を書き換えることができます。

-(void)setArrayByPassingArray:(NSMutableArray *)arrayToSet { 
    [arrrayToSet setArray:[[NSArray alloc] initWithObjects: @"test", @"test2", nil]]; 
} 
+0

あなたが '' myArray' NSMutableArray'を行う必要があり@Nick。私は 'setArrayByPassingArray'のシグネチャを修正するのを忘れました - 私は今編集しました。 – dasblinkenlight

+0

NSMutableArrayも機能しませんでしたが、 - (void)changeArray:(NSMutableArray **)array { * array = [[NSMutableArray alloc] initWithObjects:@ "test"、@ "test2"、nil]; &arrayを使用すると、ポインタを渡しています...すべてのあなたの助けをありがとう } - (void)changeArray2:(NSArray **)array { * array = [[NSMutableArray alloc] initWithObjects:@ " test "、@" test2 "、nil]; } – Nick

+0

@Nickポインタへのポインタを使ったトリックはうまくいきました。これはCとObjective Cで「貧弱な人の参照渡し」がどのように機能するかです。NSMutualArrayでのトリックも有効です:メソッドが 'setArray'割り当てを行う代わりに – dasblinkenlight