0

AAA.m:

- (void)keepCurrentArray:(id)object
{
     _currentTest=[[NSMutableArray alloc]init];
    [_currentTest addObject:@"one"];
    [_currentTest addObject:@"two"];
    [_currentTest addObject:object];
    NSLog(@"My Array is:%@",_currentTest);
}

クラスBBB.mは、オブジェクトをクラスAAAに渡します。今、Xを上記のメソッドに渡すと、配列は次のようになりますone,two,X。次に、Yを送信します。配列はone,two,Y、達成したいものの代わりになりますone,two,x,one,two,y。それは、私が毎回_currentTestを割り当てて初期化するためですか?どうすれば解決できますか?

更新: これを解決する方法についていくつかの提案がありましたが、どれもうまくいきませんでした。回答にコードだけを含む新しいプロジェクトを作成しましたが、取得した2番目のオブジェクトを追加しようとしても同じ結果が得られます:one, two, test代わりにone,two,test,one,two,test

4

4 に答える 4

2

はい、それは、そのメソッドを実行するたびに割り当てと初期化を行うためです。代わりに_currentTest = [[NSMutableArray alloc] init];、AAA.mのinitメソッドを入力してください。

AAA.m

-(id)init
{
    if ((self = [super init]))
        _currentTest = [[NSMutableArray alloc] init];
    return self;
}

- (void)keepCurrentArray:(id)object
{
    [_currentTest addObject:@"one"];
    [_currentTest addObject:@"two"];
    [_currentTest addObject:object];
    NSLog(@"My Array is:%@",_currentTest);
}
于 2012-12-08T02:49:53.693 に答える
1

これは、メソッドが呼び出されるたびに新しい配列を作成しているために発生しています。基本的には、すでに作成されているかどうかを確認し、必要な場合にのみ作成する必要があります。メソッドを次のように変更できます。

- (void)keepCurrentArray:(id)object
{
    if (!_currentTest) 
    {
        _currentTest=[[NSMutableArray alloc]init];
    }

    [_currentTest addObject:@"one"];
    [_currentTest addObject:@"two"];
    [_currentTest addObject:object];
    NSLog(@"My Array is:%@",_currentTest);
}

編集:
上記の問題に加えて、修正が必要なこのコードもあります(コメントは削除されています):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewController *kios = [ViewController new];
    [kios keepCurrentArray:@"Test"];
}

このコードは、テーブルの行をクリックするたびに新しいインスタンスを作成します。ViewController古いインスタンスを再利用するのではなく、新しいインスタンスを作成しているため、毎回空の配列から始めます。同じアレイに追加し続けるには、同じViewControllerを使い続ける必要があります。

これを行うには、宣言されたプロパティと同様に、currentTest宣言されたプロパティを.hファイルに追加する必要があります。

@property (strong,nonatomic) ViewController *kios;

次に、アクションを変更して、必要な場合にのみ(初めて)新しいView Controllerを作成し、その後それを再利用するようにします。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!_kios)
    {
        _kios = [ViewController new];
    }

    [_kios keepCurrentArray:@"Test"];
}
于 2012-12-08T03:20:11.497 に答える
1

_currentTestメソッド呼び出しの合間にそれを維持できるようにしたい場合 は、そのためのプロパティが必要です。

これを.hファイルに入れます
@property (nonatomic, copy) NSMutableArray * currentTest;

そしてこれは時間の.mファイルで

- (NSMutableArray *)currentTest
{
    if (!_currentTest)
        _currentTest = [[NSMutableArray alloc] initWithCapacity:11];

    return _currentTest;
}

- (void)keepCurrentArray:(id)object
{
    [self.currentTest addObject:@"one"];
    [self.currentTest addObject:@"two"];
    [self.currentTest addObject:object];
    NSLog(@"My Array is:%@", self.currentTest);
}

ドロップボックスに配置したコードを試してみると、想定どおりに機能し、配列はその値とすべてを保持しますが

まさにそれがあなたが達成しようとしていることではないと思われているように

あなたの問題はAAA.mにありません、あなたの問題はBBB.mにあります

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewController *kios = [ViewController new];
    [kios keepCurrentArray:@"Test"];
    [kios keepCurrentArray:@"Test2"];

}

@"test2"私はあなたが送ったコードにを自由に追加しました。これを実行すると、2回目の呼び出しが行われたときに配列がまだ存在していることがわかります。
ここでのREAL問題は、NEW毎回ViewControllerを作成していることです。真新しいもの、それは空(きれい)であるのが普通です、それは新しいものです。
月曜日にメモ帳を購入していっぱいにした場合、金曜日に別のメモ帳を購入するときに、前の月曜日に書いたものですでにいっぱいになるとは思いません。
しかし、これはまさにViewControllerに期待している動作です。

NSMutableArrayは、破棄されたり、何度も作成されたりしない他のオブジェクトに保存する必要があります。

于 2012-12-08T03:45:46.517 に答える
1

_currentTest=[[NSMutableArray alloc]init];ある方法では決して良いことではありません!!!

命名規則に従って、それはAAAクラスのプロパティのようです。したがって、プロパティの場合、alloc+initはininitまたは。のいずれかにする必要がありますawakeFromNib。そのため、ifは一度だけ初期化されます。

ただし、場合によっては、initが複数回呼び出されると、以前の値が失われ、新しいセットが追加されます。

したがって、できることは、別のクラスを作成し、この_currentTest配列をそこに配置して静的にし、ここで使用することです。これがうまくいくことを願っています。そして、そのクラスのinitメソッドで、次のように1回だけ初期化されることを確認してください。

//**this is not compiled and checked may contains typo and errors**

@implementation Storage

static NSMutableArray *yourStaticArray;

-(id)init{
    self = [super init];
    if (self) {
        if (!yourStaticArray) {
            yourStaticArray=[NSMutableArray new];
        }
    }
    return self;
}

-(void)addYourStaticArray:(NSString *)val{
    [yourStaticArray addObject:val];
}


-(NSArray *)yourStaticArray {
    return yourStaticArray ;
}

@end
于 2012-12-08T13:15:03.997 に答える