• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 为什么此代码示例在返回之前复制?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:07:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在查看用于反序列化 JSON 响应的代码示例。最后一行 return [topics copy]; 在返回之前复制数组。我已经查找了原因,它是返回一个不可变的 NSArray。

但是,这是标准做法还是高度防御性编程?调用方法会将返回值分配给某物,如果它想将返回值分配给不可变的 NSArray,它会这样做。如果它将返回值分配给 NSMutableArray 那么它会这样做。

所以我的问题是 - 是否有任何现实场景可以防止不必要的后果?

// Returns array of @c NPTopic objects
- (id)responseObjectForResponseNSURLResponse *)response dataNSData *)data errorNSError *__autoreleasing *)error
{
    if (![self validateResponseNSHTTPURLResponse *)response data:data error:error]) {
        return nil;
    }

    NSDictionary *JSONDictionary = [super responseObjectForResponse:response data:data error:error];
    if (!JSONDictionary) return nil;

    // Note: the expected JSON format of this response is { data: [ { <a topic> }, { <another topic>} ], metadata: { ...} }
    NSArray *JSONTopics = JSONDictionary[@"data"];

    NSMutableArray *topics = [NSMutableArray array];
    for (NSDictionary *JSONTopic in JSONTopics) {
        // For each topic in JSON format, we can deserialize it from JSON to our desired model class using Mantle
        NPTopic *topic = [MTLJSONAdapter modelOfClass:[NPTopic class] fromJSONDictionary:JSONTopic error:error];
        if (!topic) return nil;
        [topics addObject:topic];
    }

    *error = nil;
    return [topics copy];
}



Best Answer-推荐答案


副本是这样的,它返回一个 NSArray,而不是 NSMutableAray。问题是如果返回一个 NSMutableAray 它可以被更改,这可能是一个问题,即有多个指向它的指针并且一个进行更改,但另一个假定它是不可变的并且不会更改。

这是个好习惯。

不要对实际实现做出假设,有几种方式可以在不实际复制的情况下发生“复制”。在不需要和证明的情况下关注性能被称为“过早优化”,并再次受到包括著名的 Donald Knuth 在内的许多人的警告。

它确实应该返回类型为 NSArray *,而不是 id,以便编译器可以捕获类型错误。

关于ios - 为什么此代码示例在返回之前复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371467/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap