IOS 5+; ARC启用; aws-ios-sdk 1.5.0
我正在尝试将文件从Amazon S3中的一个“文件夹”复制到“另一个”。我可以在Amazon S3上看到已经成功复制的文件,但之后我的应用程序因内存错误而崩溃
我可以看到copyObject
已被弃用,但我必须复制文件,因此我使用它并在启用僵尸时出现以下错误;
-S3CopyObjectResponse release:发送到解除分配的实例的消息
//copy request
S3CopyObjectRequest *copyToNewFolder=[[S3CopyObjectRequest alloc] initWithSourceKey:amazonFileName sourceBucket:[Constants userEventBucket] destinationKey:destinationFile destinationBucket:[Constants userEventBucket]];
copyToNewFolder.metadataDirective = @"COPY";
S3CopyObjectResponse *copiedResponse=[self.s3 copyObject:copyToNewFolder];
if(copiedResponse.error != nil)
{
NSLog(@"Error: %@", copiedResponse.error);
return;
}
如何在不出现内存错误的情况下复制文件?
答案 0 :(得分:2)
这是一个有趣的问题,因为AWS SDK中方法命名选择不当。请注意,AWS SDK不支持ARC。
[self.s3 copyObject:copyToNewFolder];
当ARC看到此方法名称时,它假定该方法根据Obj-C命名约定返回具有未完成保留计数的值。 Methods in the alloc, copy, init, mutableCopy, and new families are implicitly marked __attribute__((ns_returns_retained))
(Source)。但是,令人惊讶的是,这个copyObject
方法返回一个自动释放的实例(请参阅AmazonS3Client.m:474和AmazonS3Client.m:578),因为AWS在此处使用copy
在不同的上下文中。结果?过度释放的对象和崩溃。
解决方案是使用__attribute__((ns_returns_not_retained))
或NS_RETURNS_NON_RETAINED
明确标记方法。我看到亚马逊已经弃用了这种方法(可能是为了纠正你所面临的问题),所以你可以简单地使用objectCopy
方法。