何时释放核心基础或核心图形对象? 我在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)后放弃其所有权
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);