代码之家  ›  专栏  ›  技术社区  ›  Nate

我需要发布复制的nsobjects-objective-c吗?

  •  14
  • Nate  · 技术社区  · 15 年前

    我想知道是否需要释放一个复制的nsObject?例如,我只创建一个复制到数组中的字典:

    代码:

    for (int num = 0; num < [object count]; num++) {
        [dictionary setObject:[object objectAtIndex:num] forKey:@"x"];
        [array addObject:[dictionary copy]];
    }
    

    我必须出版这本词典吗?如果是,什么时候?

    谢谢

    4 回复  |  直到 15 年前
        1
  •  24
  •   Noah Witherspoon    15 年前

    是的,你知道。在这种情况下,您可能应该在将副本添加到数组后立即释放副本,因为数组保留了添加到副本中的任何内容:

     NSDictionary *copied = [dictionary copy];
     [array addObject:copied];
     [copied release];
    
        2
  •  5
  •   Victor    15 年前

    文档中的此片段:

    -(ID)副本

    返回值 nscopying协议方法copyWithZone:返回的对象,其中Zone为零。

    讨论 对于采用nscopying协议的类来说,这是一种方便的方法。如果没有CopyWithZone的实现,则引发异常:。

    nsObject本身不支持nscopying协议。子类必须支持协议并实现copyWithZone:方法。copyWithZone:方法的子类版本应首先将消息发送给super,以合并其实现,除非子类直接从nsObject下降。

    特别注意事项 如果您使用的是托管内存(而不是垃圾收集),则此方法在返回新对象之前会将其保留。 但是,方法的调用程序负责释放返回的对象。

        3
  •  2
  •   Georg Fritzsche    15 年前

    copy ,您将获得返回对象的所有权。容器还拥有添加到容器中的对象的所有权。
    因此,正如诺亚指出的那样,你必须放弃拷贝的所有权。这个 Cocoa memory management guidelines 包含一节注释 how to work with containers .

        4
  •  0
  •   Jeff    15 年前

    很难说,如果看不到您在哪里创建字典,这是否明智。如果字典中没有其他成员,那么做类似的事情会更简单(尽管可以说很难阅读)。

    for (int num = 0; num < [object count]; num++) {
        [array addObject:[NSDictionary
                               dictionaryWithObject:[object objectAtIndex:num]
                                            forKey:@"x"
                         ]
        ]
    }
    

    那会给你 真实的 数组中的nsDictionary对象,而不是您正在创建的nsMutableDictionary副本。