0

好的,所以我正在处理两组极其相似的数据,同时,这些数据集都是对象内的全局 NSMutableArrays。

data_set_one = [[NSMutableArray alloc] init];
data_set_two = [[NSMutableArray alloc] init];

加载了两个新的 NSMutableArray,需要将它们添加到旧的现有数据中。这些数组也是全局的。

xml_dataset_one = [[NSMutableArray alloc] init];
xml_dataset_two = [[NSMutableArray alloc] init];

为了减少代码重复(并且因为这些数据集非常相似),我在类中编写了一个 void 方法来处理两个数组的数据组合过程:

-(void)constructData:(NSMutableArray *)data fromDownloadArray:(NSMutableArray *)down withMatchSelector:(NSString *)sel_str

现在,我对面向对象编程有了不错的理解,所以我在想,如果我要像这样使用数据中的全局数组调用该方法......

[self constructData:data_set_one fromDownloadArray:xml_dataset_one withMatchSelector:@"id"];

然后全局 NSMutableArrays (data_set_one) 将反映方法内“数组”发生的变化。可悲的是,情况并非如此, data_set_one 没有反映方法之外的更改(例如:数组中的新对象)。

这是问题的代码片段

// data_set_one is empty
// xml_dataset_one has a few objects

[constructData:(NSMutableArray *)data_set_one fromDownloadArray:(NSMutableArray *)xml_dataset_one withMatchSelector:(NSString *)@"id"];

// data_set_one should now be xml_dataset_one, but when echoed to screen, it appears to remain empty

这里是该方法的代码要点,任何帮助表示赞赏。

-(void)constructData:(NSMutableArray *)data fromDownloadArray:(NSMutableArray *)down withMatchSelector:(NSString *)sel_str {
    if ([data count] == 0) {
        data = down;  // set data equal to downloaded data
    } else if ([down count] == 0) {
        // download yields no results, do nothing
    } else { 
        // combine the two arrays here 
    }
}

此项目未启用 ARC。

谢谢你们的帮助!抢

4

1 回答 1

0

如果我理解您的问题,您正在尝试将您的对象作为引用调用传递,并希望像在 C++/C 中一样工作。但是Obj-C,虽然类似但有一些不同的方式。您必须使用 ** (双指针)取消引用对象,这在 NSError 情况下最为常见,这种情况非常罕见。

第二种方法是:将方法包装为一个块。然后将变量放在与块相同的词法范围内,并用__block存储类型表示。

第三种方法可以通过将其设为 ivar/property 甚至是单例来直接访问您的对象。

于 2012-12-08T11:45:46.800 回答