2

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

メモリエラーを発生させずにファイルをコピーするにはどうすればよいですか?

4

1 に答える 1

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))ソース)。しかし、驚いたことに、このcopyObjectメソッドは自動解放されたインスタンス ( AmazonS3Client.m:474AmazonS3Client.m:578を参照) を返します。これは、AWS がcopyここで別のコンテキストで使用しているためです。結果?オーバーリリースされたオブジェクトとクラッシュ。

__attribute__((ns_returns_not_retained))解決策は、メソッドを明示的にorでマークすることNS_RETURNS_NON_RETAINEDです。Amazon は既にこのメソッドを非推奨にしているようです (おそらく直面している問題を修正するため)。そのため、objectCopy代わりにメソッドを使用できます。

さらに読む: 1 , 2

于 2013-05-16T18:52:24.237 に答える