2013-05-16 89 views
2

IOS 5+; ARC已啓用; aws-ios-sdk 1.5.0AWS iOS SDK 1.5.0 copyObject導致內存錯誤崩潰

我試圖將文件從一個「文件夾」複製到另一個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; 
      } 

我怎樣才能複製文件沒有得到內存錯誤?

回答

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:474AmazonS3Client.m:578),因爲AWS在此處的不同上下文中使用copy。結果?過度釋放的對象和崩潰。

解決方法是用__attribute__((ns_returns_not_retained))NS_RETURNS_NON_RETAINED明確標記該方法。我發現亞馬遜已經不贊成使用這種方法(也許是爲了糾正你面臨的問題),所以你可以簡單地使用objectCopy方法。

延伸閱讀:12

+0

感謝隊友在整個下午都敲我的頭這 –