0

私は次のコードを持っています:

- (IBAction)goButton:(id)sender 
{

    if(buttonCount==0)
    {
        previousStateArray=setUpArray;
          NSLog(@"previous array count=%d",[previousStateArray count]);
        [setUpArray removeAllObjects];
        for(Node *n in nodeArray)
        {
            if(![temp isEqualToString:n.strName])
            {
                [setUpArray addObject:n.strName];

            }
            temp=n.strName;         
        }    
    }
}  

- (IBAction)backButton:(id)sender 
{

    [setUpArray removeAllObjects];
    setUpArray=previousStateArray;
     NSLog(@"previous array count=%d",[previousStateArray count]);
    buttonCount--;       
  }

setUpArrayとpreviousStateArrayの両方が-メソッドで宣言されていviewDidLoadます。私のビューは1回だけ読み込まれます。最初のNSLogでは出力として1を取得していますが、2番目のNSLogでは取得しています。

出力として0が表示されますが、配列が再度初期化されることはありません。それで、なぜこれが起こっているのですか?

4

5 に答える 5

1

問題は配列ポインタにあります。

goButton

previousStateArray=setUpArray;

previousStateArrayこれで、が指しているのと同じ配列setUpArrayを指します。

[setUpArray removeAllObjects];

これによりすべてのオブジェクトが削除され、両方のポインターが空の配列を指すようになります。

backButton

setUpArray=previousStateArray;

これらは両方とも同じ空の配列を指しているため、この行は冗長です。ポインタを交換する場合は、一時的なポインタを保持する必要があります。

于 2012-05-14T07:05:12.040 に答える
1

あなたのコードで

`previousStateArray=setUpArray;`  //previousStateArray pointing to same memory location of setUpArray.

クラス- (void)setArray:(NSArray *)otherArrayのメソッドを使用します。NSMutableArray

[previousStateArray setArray: setUpArray];
[setUpArray setArray:previousStateArray];  

- (IBAction)goButton:(id)sender 
{

    if(buttonCount==0)
    {
        [previousStateArray setArray: setUpArray];
          NSLog(@"previous array count=%d",[previousStateArray count]);
        [setUpArray removeAllObjects];
        for(Node *n in nodeArray)
        {
            if(![temp isEqualToString:n.strName])
            {
                [setUpArray addObject:n.strName];

            }
            temp=n.strName;         
        }    
    }
}  

- (IBAction)backButton:(id)sender 
{

    [setUpArray removeAllObjects];
    [setUpArray setArray:previousStateArray];
     NSLog(@"previous array count=%d",[previousStateArray count]);
    buttonCount--;       
  }
于 2012-05-14T07:11:36.437 に答える
0

giorashcの答えは正しいと思います。問題は、配列に「=」を使用すると、previousStateArrayがsetUpArrayの同じメモリを指すようにするだけです。つまり、previousStateArrayはsetUpArrayと同じです。

詳細については、ディープコピーとシャローコピーを検索してください。

于 2012-05-14T07:14:53.227 に答える
0

アレイを初期化します

setUpArray = [[NSMuatableArray alloc] init];
于 2012-05-14T06:53:32.417 に答える
-1

if(0 == buttonCount)また、ではなくを使用する必要がありますif(buttonCount==0)

于 2012-05-14T07:54:10.830 に答える