ios - 传递给不同类中的方法时,Objective-C NSArray 无法更改

标签 ios objective-c c nsarray

我有一个 NSArray,我需要更改其中各项的顺序。我写了一个方法来确定新顺序:

+(NSArray*)sortProxyForms:(NSArray*)arrayOfForms
{
    NSArray* sortedForms = [arrayOfForms sortedArrayUsingComparator:^(HPSModelFormProxy* a, HPSModelFormProxy* b) {

        return [@(a.ordinal) compare:@(b.ordinal)]; // @(a.ordinal) aka Boxing turns int into NSNumber

    }];

    arrayOfForms = [sortedForms copy]; // DOES NOT WORK

    return sortedOfForms; // WORKS IF ASSIGNED IN THE CALLER

}

因此,我可以将要排序的 NSArray 传递到方法中。我这样调用方法:

[HPSModelUtilities sortProxyForms:_formProxies];

如果我真的尝试在方法中设置 arrayOfForms(对 _formProxies 的引用),那么一旦我从该方法返回,数组就不会改变。

但是,如果我从方法中返回排序后的数组并将其分配给调用方法中的 NSArray,则分配有效:

_formProxies = [HPSModelUtilities sortProxyForms:_formProxies]; // _formProxies NSArray is changed

_formProxies 在调用类中声明,“HPSModelUtilities”是一个不同的类。

为什么 NSArray 可以在调用者中更改,但在被调用方法中却不能更改,即使它是通过引用传递的?

最佳答案

当您将值传递给方法时,它会被复制。这称为“按值传递”。您传入的 arrayOfForms 是指向 NSArray指针。这意味着指针在传入时被复制。将此指针重定向到 NSArray 的另一个实例不会改变原始指针指向的位置。

我会将您的方法重命名为 (NSArray*)sortedArrayFromProxyForms:(NSArray*)proxyForms

如果你真的想改变你的 NSArray 引用在方法中指向的位置。这样做。

+ (void)sortProxyForms:(NSArray**)proxyForms {
    *proxyForms = sortedForms;
}

关于ios - 传递给不同类中的方法时,Objective-C NSArray 无法更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23638868/

相关文章:

ios - 具有许多粒子的逐帧动画?

ios - 带扫描指示器的条形码阅读器

iphone - UIScrollView 奇怪的 ScrollIndicator 与 UITableView 相比

ios - 应用程序特定的 UIPasteboard

c - 仅映射文件 C 的第一个字母

ios - Swift 协议(protocol)委托(delegate)未被解雇

ios - NSString boundingRectWithSize 返回不必要的高度

ios - 比较行数和 indexpath.row

c - 内存集和 SIGSEGV

c - 这个#define 示例如何工作?