菜鸟教程小白 发表于 2022-12-12 14:07:36

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


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

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

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

<pre><code>// Returns array of @c NPTopic objects
- (id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)error
{
    if (!) {
      return nil;
    }

    NSDictionary *JSONDictionary = ;
    if (!JSONDictionary) return nil;

    // Note: the expected JSON format of this response is { data: [ { &lt;a topic&gt; }, { &lt;another topic&gt;} ], metadata: { ...} }
    NSArray *JSONTopics = JSONDictionary[@&#34;data&#34;];

    NSMutableArray *topics = ;
    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 = fromJSONDictionary:JSONTopic error:error];
      if (!topic) return nil;
      ;
    }

    *error = nil;
    return ;
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>副本是这样的,它返回一个 <code>NSArray</code>,而不是 <code>NSMutableAray</code>。问题是如果返回一个 <code>NSMutableAray</code> 它可以被更改,这可能是一个问题,即有多个指向它的指针并且一个进行更改,但另一个假定它是不可变的并且不会更改。 </p>

<p>这是个好习惯。</p>

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

<p>它确实应该返回类型为 <code>NSArray *</code>,而不是 <code>id</code>,以便编译器可以捕获类型错误。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为什么此代码示例在返回之前复制?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28371467/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28371467/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为什么此代码示例在返回之前复制?