我有一个 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/