0

我将 ivar (NSMutableArray) 传递给某个方法。我期待如果我在函数内部修改对象,它会反映在函数外部,但是在这种情况下我需要设置对象;类似于以下内容:

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

但是我注意到,当我设置它时,函数内部imAnIvar的内存引用会发生变化,并且鉴于此,实际的 ivar 不会改变。我知道问题在于我正在更改方法内对象的引用,因此它停止指向 ivar,然后指向其他一些随机内存方向。

我想到了一个解决这个问题的方法,它可以是在调用函数之前确保 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

为什么不对数组使用 getter,这样您在使用时就不需要检查数组是否为 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 回答