【问题标题】:Should I release the NSError object of NSFileManager's copyItemAtPath:toPath:error:?我应该释放 NSFileManager 的 copyItemAtPath:toPath:error: 的 NSError 对象吗?
【发布时间】:2010-08-27 03:52:50
【问题描述】:

NSFileManager 有一个复制的方法。

- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error

如果发生错误,第三个参数(NSError **)在返回时会包含一个描述问题的NSError对象。

问题:我需要发布它吗?

还有一些其他的方法,比如这个采用(NSString **),

NSPropertyListSerialization +(NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format errorDescription:(NSString **)errorString

它们是否遵循相同的内存管理规则?放还是不放,这是个问题。

---答案

正如安德斯所说,答案是“不”发布。

我很困惑,因为 NSPropertyListSerialization 类有一个方法

+ (NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format errorDescription:(NSString **)errorString

文档说如果不是零,我应该释放第三个参数。但是它已被弃用并被

取代
+ (NSData *)dataWithPropertyList:(id)plist format:(NSPropertyListFormat)format options:(NSPropertyListWriteOptions)opt error:(NSError **)error

现在参数是 (NSError **)。无需像其他类似方法一样释放。所以一般的内存管理规则是不需要释放这种参数的。

---参考文档

在 Apple 的 Advanced Memory Management Programming Guide 中,您不拥有通过引用返回的对象部分:

当您调用任何这些方法时,您不会创建 NSError 对象,因此您不拥有它。

【问题讨论】:

    标签: cocoa cocoa-touch memory-management


    【解决方案1】:

    返回的 NSError 对象是一个自动释放的对象,所以你不应该释放它

    参数只是告诉函数将返回的错误对象(如果有的话)放在哪里

    编辑:今天好像不能拼写

    【讨论】:

      【解决方案2】:
      [NSPropertyListSerialization propertyListFromData:(NSData *) mutabilityOption:(NSPropertyListMutabilityOptions) format:(NSPropertyListFormat *) errorDescription:(NSString **)]
      

      如果你正在处理类似这样的返回

      (NSString **)
      

      那么您应该检查清楚说明您是否需要发布它的文档。如果文档没有说明您释放返回对象的任何内容,例如

      - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error
      

      那就不用管它们了,它们会在适当的时候被释放或者已经被框架自动释放了。

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2011-03-21
        • 2017-04-01
        • 1970-01-01
        • 2012-06-15
        相关资源
        最近更新 更多