2

IOS 5+;弧启用;aws-ios-sdk 1.5.0

我正在尝试将文件从 Amazon S3 中的一个“文件夹”复制到“另一个”。我可以在 Amazon S3 上看到文件已成功复制,但之后我的应用程序因内存错误而崩溃

我可以看到copyObject已弃用,但我必须复制文件,所以我使用它并在启用僵尸时出现以下错误;

-S3CopyObjectResponse 释放:消息发送到释放的实例

//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;
            }

如何复制文件而不会出现内存错误?

4

1 回答 1

2

这是一个有趣的问题,源于 AWS SDK 中方法命名的错误选择。请注意,AWS 开发工具包不支持 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))来源)。但是,令人惊讶的是,此copyObject方法返回一个自动释放的实例(请参阅AmazonS3Client.m:474AmazonS3Client.m:578),因为 AWScopy在这里使用的是不同的上下文。结果?过度释放的对象和崩溃。

解决方案是用__attribute__((ns_returns_not_retained))or显式标记该方法NS_RETURNS_NON_RETAINED。我看到亚马逊已经弃用了这种方法(也许是为了纠正你面临的问题),所以你可以简单地使用objectCopy方法来代替。

延伸阅读1、2

于 2013-05-16T18:52:24.237 回答