1

私は NSArray プロパティを持つクラスを ARC を使用して空想のないもので持っています...

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

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

別のクラス内でメソッドを使用してその配列を設定しようとした場合、配列のみが渡された場合は設定されません。ただし、クラスが渡された場合は設定されますが、その理由はわかりません....

これを両方の方法で試みるコードは以下のとおりです...

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];
}

文字列だけで他のメソッドをいくつか試しましたが、文字列は変更されていないため、それらを含むクラスが渡された場合に変更される理由がわかりません...

4

1 に答える 1

1

最初setArrayByPassingArray:の例のメソッドは、新しく作成されNSArrayた をそのパラメーターに割り当てます。これはvalueで渡され、メソッドを終了するとすぐに破棄されます。ここで何が起こるかというと、 をmyArray呼び出す前に への参照のコピーが作成されます (配列のコピーではなく、その配列への参照のコピーのみです) setArrayByPassingArray:myArrayそのコピーは のメンバーに添付されなくなりましたMyClass

2 番目の例はクラスを渡していません。クラスのインスタンスを渡してから、ドット表記を正しく使用しmyArrayてインスタンスにプロパティを割り当てます。そのため、この 2 番目の例は機能しますが、最初の例は機能しません。

NSMutableArrayプログラム全体の代わりに使用する場合はNSArray、最初の例を書き直して機能させることができます。

-(void)setArrayByPassingArray:(NSMutableArray *)arrayToSet {
    [arrrayToSet setArray:[[NSArray alloc] initWithObjects: @"test", @"test2", nil]];
}
于 2012-04-15T00:27:30.327 に答える