何时释放核心基础或核心图形对象? 我在iOS 10和iOS 11中使用核心图形和核心基础对象。我应该什么时候发布它?或者它会由ARC自动处理,我不应该费心释放它

何时释放核心基础或核心图形对象? 我在iOS 10和iOS 11中使用核心图形和核心基础对象。我应该什么时候发布它?或者它会由ARC自动处理,我不应该费心释放它,ios,objective-c,Ios,Objective C,原因是如果我发布一个CGDataProviderRef 使用CGDataProviderRelease(inputPDFDataProvider): “。。。它会由ARC自动处理吗?我不应该费心释放它?” 答案是肯定的,您应该总是手动调用核心图形对象上的CFRelease来释放分配的内存 关于崩溃,如果您调用CGDataProviderRelease 苹果文档(): 此函数与CFRelease等效,只是如果provider参数为NULL,它不会导致错误。与手动存储管理一样,所有权是决定性因素。发

原因是如果我发布一个
CGDataProviderRef
使用CGDataProviderRelease(inputPDFDataProvider):


“。。。它会由ARC自动处理吗?我不应该费心释放它?”

答案是肯定的,您应该总是手动调用核心图形对象上的CFRelease来释放分配的内存

关于崩溃,如果您调用CGDataProviderRelease 苹果文档():


此函数与CFRelease等效,只是如果provider参数为NULL,它不会导致错误。

与手动存储管理一样,所有权是决定性因素。发件人:

  • 如果您创建了一个对象(直接创建或通过复制另一个对象,请参见创建规则),您将拥有该对象
  • 如果你从其他地方得到一件物品,你就不拥有它。如果要防止其被处置,必须将自己添加为所有者(使用CFRetain)
  • 如果您是对象的所有者,则必须在使用完对象(使用CFRelease)后放弃其所有权
当且仅当您是对象的所有者时,您必须释放对象

但您可以将所有权转让给ARC。如果将此函数的结果赋给Objective C变量,则不再拥有参数中的对象

对于您的情况:您是
inputPDFDataProvider
的所有者,因为
cgdataprovider createwithcfdata
与以下内容匹配:

  • 在名称中嵌入“创建”的对象创建函数
  • 在名称中嵌入“复制”的对象复制函数

因此,
CGDataProviderRelease
是正确的。但是,
inputFileData
的内存管理中可能存在错误。您的
inputPDFDataRef
已通过
\u桥
inputFileData
分配。因此,不存在所有权转让,当您准备好使用时,您应该释放
inputPDFDataRef
。当
inputFileData
被释放时,它将被自动释放


有关更多信息,请参阅。

这并不总是正确的:您可以将所有权转让给ARC。转移甚至可以用核心基础/核心图形对象,没有客观的C等价物!这一点很好,但如果不清楚ARC何时发布inputFileData,我会使用CfBrigingRetain而不是_桥转换来添加所有权。如果它是一个局部变量,则每次使用inputFileData后都可能出现。
//file ref
CFURLRef pdfOutputURL = (  CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:pdfOutputPath]);
CFDataRef inputPDFDataRef = (__bridge CFDataRef)inputFileData;
CGDataProviderRef inputPDFDataProvider = CGDataProviderCreateWithCFData(inputPDFDataRef);
CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithProvider(inputPDFDataProvider);
numberOfPages = CGPDFDocumentGetNumberOfPages(pdfRef);

// Release Core Graphics and Core Foundation Object
CGPDFDocumentRelease(pdfRef);
//    CGDataProviderRelease(inputPDFDataProvider); **// CRASHES When releasing this CoreGraphics object**
CFRelease(inputPDFDataRef);
CFRelease(pdfOutputURL);