返回副本或可变对象

use*_*084 3 cocoa objective-c

哪种变体更正确?

//first variant
    - (NSArray*) someArray
    {
     NSMutableArray* mutArr = [[NSMutableArray alloc] init];

     //...some operations with mutArr


     NSArray* retArray = [mutArr copy];

     [mutArr release]; //remove mutArr

     return [retArray autorelease];
    }

//second variant
    - (NSArray*) someArray
    {
     NSMutableArray* mutArr = [[NSMutableArray alloc] init];

     //...some operations with mutArr 

     return (NSArray*)[mutArr autorelease];
    }
Run Code Online (Sandbox Code Playgroud)

ben*_*ado 6

答案是,如果在返回数组后更改了数组会有多少问题?

如果你在方法中创建一个可变数组然后返回它,再也不用它,我认为返回可变版本是好的.您的方法声明NSArray的返回类型这一事实意味着您不能保证该数组是可变的.您不必保证它是不可变的.

另一方面,如果要返回类在内部使用的数组,则返回不可变副本会更安全.在上面的示例中,情况似乎并非如此.

数组的使用者,如果想要保留引用,应该使用copy而不是retain; 如果数组是可变的,它们将获得一个不可变的副本.如果它已经是不可变的,则只会增加引用计数.因此复制不可变对象没有任何惩罚.

换句话说,你的第二个变体很好.(虽然演员(NSArray *)阵容完全没必要.)