0

ivar (NSMutableArray) をいくつかのメソッドに渡しています。関数内のオブジェクトを変更すると、関数の外に反映されると思っていましたが、この場合はオブジェクトを設定する必要があります。次のようなもの:

- (void) someMethod:(SMResponseObject *)response onData:(NSMutableArray *)imAnIvar {
    imAnIvar = [response objects];
    //Some other stuff
}

しかし、関数内のimAnIvarのメモリ参照は、設定すると変更されることに気付きました。それを考えると、実際の ivar は変更されません。問題は、メソッド内のオブジェクトの参照を変更しているため、ivar を指すのをやめ、他のランダムなメモリ方向を指すことであることを理解しています。

この問題の解決策の 1 つを考えました。関数を呼び出す前に ivar が nil でないことを確認し、次のようにすることができます。

- (void) someMethod:(SMResponseObject *)response onData:(NSMutableArray *)imAnIvar {

    NSMutableArray *data = [response objects];
    [arrayForTableView removeAllObjects];
    for(id element in data){
        [imAnIvar addObject:element];
    }
    //Some other stuff
}

そのため、直接設定するのではなく、元のオブジェクトを使用します。問題は、これが機能するためには、ivar が nil ではないことを確認する必要があることです。これは、メソッドへの呼び出しごとに次のようなことを行う必要があるため、きれいではないと思います。

if(!_ivar){
  //alloc it
}

私の質問は次のとおりです。ローカルスコープ変数を設定していても、元の変数を強制的に指すようにする方法はありますか? そうでない場合、これを機能させるためのよりクリーンな方法はありますか?

4

3 に答える 3

3

これのことですか?

- (void)setFoo:(SomeClass **)objPtr
{
    *objPtr = someOtherObject;
}

// call it as:

SomeClass *foo = someObject;
NSLog(@"Before: %@", foo);
[self setFoo:&foo];
NSLog(@"After: %@", foo);
于 2013-03-01T16:35:09.200 に答える
1

配列の使用中に配列が nil であることを確認する必要がないように、配列にゲッターを使用しないのはなぜですか?

-(NSMutableArray *)iAmAnIvar {
   if(_iAmAnIvar == nil) {
     _iAmAnIvar = [NSMutableArray array];
   }
   return _iAmAnIvar;
 }

そして、質問で述べたように、配列に値を設定する必要がある場合は、使用できます

[self.iAmAnIvar removeAllObjects];
[self.iAmAnIvar addObject:someObj];
于 2013-03-01T16:38:16.553 に答える
-2

- (id)copy;の機能が使えると思いますNSObject

コードは次のようになります。

 - (void)someFunction:(NSString *)someArg
 {
     NSString *str = [someArg copy];
 }
于 2013-03-01T16:36:22.310 に答える