gpt4 book ai didi

ios - AWS iOS SDK 1.5.0 copyObject 导致内存错误崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:57 26 4
gpt4 key购买 nike

iOS 5+;启用 ARC;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;
}

如何在不出现内存错误的情况下复制文件?

最佳答案

这是一个有趣的问题,由 AWS SDK 中方法命名的错误选择引起。请注意,AWS 开发工具包不支持 ARC。

[self.s3 copyObject:copyToNewFolder];

当 ARC 看到此方法名称时,它会根据 Obj-C 命名约定假定该方法返回一个具有未完成保留计数的值。 alloc、copy、init、mutableCopy 和 new 系列中的方法隐式标记为 __attribute__((ns_returns_retained)) ( Source )。但是,令人惊讶的是,此 copyObject 方法返回一个自动释放的实例(参见 AmazonS3Client.m:474AmazonS3Client.m:578 ),因为 AWS 在此处的不同上下文中使用 copy。结果?过度释放的对象和崩溃。

解决方案是使用__attribute__((ns_returns_not_retained))NS_RETURNS_NON_RETAINED 显式标记该方法。我看到亚马逊已经弃用了这种方法(可能是为了纠正您面临的问题),因此您可以简单地使用 objectCopy 方法。

进一步阅读:1 , 2

关于ios - AWS iOS SDK 1.5.0 copyObject 导致内存错误崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16593687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com