1

1つのクラス(classA)が乱数を生成し、それを可変配列に追加するプログラムを作成しています。ビューコントローラ(viewControllerA)は、classAからメソッドを呼び出し、乱数の配列を受け取り、それを独自の配列に格納します。

同じ配列を必要とする別のクラス(classB)があります。viewcontrollerAは、配列で必要な処理を終了した後、classBの配列のsetterメソッドを呼び出します。classBの配列のsetterメソッドとgetterメソッドでNSLogを呼び出して、配列が読み込まれるかどうかを確認します。

-(void)setRandomNumberArray:(NSArray *)randomNumberArray{
_randomNumberArray = randomNumberArray;

NSLog(@"%@ setter", _randomNumberArray);
}

-

-(NSArray *)randomNumberArray{
if (!_randomNumberArray) {
    _randomNumberArray = [[NSArray alloc] init];
}

NSLog(@"%@ getter", _randomNumberArray);
return _randomNumberArray;
}

viewControlerAでsetterメソッドを呼び出すと、NSLogは配列の値を返します。viewControllerBでgetterメソッドを呼び出すと、NSLogはgetterメソッドから何も出力しません。

2012-05-29 23:57:43.589 SwipeGame[8603:f803] (
) getter

明らかに配列を設定していますが、取得したいときのために保持していません。何が起こっている?私は他の複数の手法を試しましたが、常に配列を設定しますが、配列を「取得」したいときのために保持しません。

私の配列のプロパティは、ところで保持するように設定されています。

更新:はい、私はARCを使用しています。私の財産宣言は次のとおりです。

@property (nonatomic, strong) NSArray *randomNumberArray

解決済み:ご協力いただきありがとうございます。インスタンスの問題でした。

4

3 に答える 3

1

あなたのセッターメソッドはviewControllerBについて言及していません。内部変数を設定しているだけです。viewControllerB は、配列が設定されたことをどのように知るのでしょうか?

最も簡単な方法は、@propertiesandを使用すること@synthesizeです。

// in A
viewControllerB.array = _array; 

保持に関する質問: ARC を使用している場合は、心配する必要はありません。

于 2012-05-30T06:39:52.393 に答える
1

ARCを使用していますか?

以下のARCバージョン:

@interface Foo : NSObject {
  NSMutableArray *_randomNumberArray;
}
@property (nonatomic, strong) NSMutableArray *randomNumberArray;
@end

@implementation Foo
@synthesize randomNumberArray = _randomNumberArray;
- (void)setRandomNumberArray:(NSMutableArray *)randomNumberArray {
    _randomNumberArray = randomNumberArray;
    NSLog(@"%@ setter", _randomNumberArray);
}

- (NSMutableArray *) randomNumberArray {
  if ( _randomNumberArray == nil )
    _randomNumberArray = [[NSMutableArray alloc] init];

  NSLog(@"%@ getter", _randomNumberArray);
  return _randomNumberArray;
}
@end

以下のARCバージョンではありません:

@interface Foo : NSObject {
  NSMutableArray *_randomNumberArray;
}
@property (nonatomic, strong) NSMutableArray *randomNumberArray;
@end

@implementation Foo
@synthesize randomNumberArray = _randomNumberArray;
- (void)setRandomNumberArray:(NSMutableArray *)randomNumberArray {
    [_randomNumber release];
    _randomNumberArray = randomNumberArray;
    [_randomNumberArray retain];
    NSLog(@"%@ setter", _randomNumberArray);
}

- (NSMutableArray *) randomNumberArray {
  if ( _randomNumberArray == nil )
    _randomNumberArray = [[NSMutableArray alloc] init];

  NSLog(@"%@ getter", _randomNumberArray);
  return _randomNumberArray;
}

- (void)dealloc {
   [_randomNumberArray release];
}

@end
于 2012-05-30T07:20:09.490 に答える
0

を使用してこの乱数配列を作成しNSMutableArray、それをセッターに渡す場合、配列は後で呼び出し元によって変更される可能性があり (たとえば、すべてのアイテムが削除されます)、配列は足元から変更される可能性があります。

NSArrayおよびのようNSStringな変更可能なサブタイプを持つ型の場合、プロパティをcopyではなくとして宣言する必要がありますstrong。これにより、渡された配列が後で他の誰かによって変更されないようにすることができます。通常の不変型はコピーを非常に効率的に処理するため、コピーのパフォーマンスは問題になりません。

于 2012-05-30T10:11:51.433 に答える