objective-c - 返回可变的值,而返回值应该是不可变的

标签 objective-c cocoa

我找到了这段代码

-(NSString *) genRandStringLength: (int) len {

    NSMutableString *randomString = [NSMutableString stringWithCapacity: len];

    for (int i=0; i<len; i++) {
         [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
    }

    return randomString;
}

可以传递一个可变对象,而结果是不可变的吗?

那么我们应该做什么呢?

return [randomString copy];

return randomString;

最佳答案

从技术上讲,返回 NSMutableString 而不是 NSString 是没有问题的。由于前者是后者的子类,因此 NSMutableString 实例支持 NSString 所做的一切。例如,如果您查看 Cocoa,您会注意到许多 alloc/init 方法返回您想要创建的类的子类的实例。

在您的特定情况下,如果该方法返回可变字符串,我认为没有问题,因为该字符串是在该方法中本地创建的,并且没有在类中的其他地方使用。

通常,如果这些对象是返回它们的类的 ivars/properties,您可能应该避免返回可变对象。如果您这样做,该方法的调用者可能会发现返回的对象是可变的,然后更改其内容,而无需通知该对象的“拥有”实例有关更改的信息。

另请注意,如果要返回不可变对象(immutable对象),return [randomString copy]; 仅在 ARC 和垃圾回收下正确。使用手动内存管理,应该是 return [[randomString copy] autorelease];return [NSString stringWithString:randomString];

关于objective-c - 返回可变的值,而返回值应该是不可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10928374/

相关文章:

objective-c - 在 Objective-C 中使用 GUI 进行日志记录

macos - 开发多窗口 Mac 应用程序所需的建议

objective-c - cocoa 上的棕色噪音

ios - #定义负数?

ios - 自动布局约束 - 具有可变高度的项目的垂直间距

objective-c - 如何将 UIImage 从 iPhone 应用程序传递到 Apple Watch 应用程序

iOS 理解图层蒙版

objective-c - 在 Cocoa 中以平铺图案绘制图像

objective-c - 为什么我的方法为同一变量返回不同的值

objective-c - 如何在 Cocoa 中运行另一个应用程序后运行我自己的应用程序?