これがバグかどうかわからないので、アドバイスを求めています...
(xcode 5.1.1 上の iOS 7.1.2)
私のアプリは、多くの大きなデータ イメージをコアデータに保存します。バイナリ イメージの属性は、エンティティで「外部ストレージを許可する」に設定されているため、アプリの _EXTERNAL_DATA サブフォルダーにファイル (guid) が表示されます。
このアプリの存続期間中、ファイルは定期的に変更されるため、既存の画像を上書きしてコンテキストを保存します。
問題は、新しいイメージ ファイル (GUID) の孤立したコピーが表示されるのに、古いイメージ ファイルが削除されないことです。
これは次のように再現できます...
コアデータを利用する「テスト」ボタンを備えたユーティリティ アプリを作成し、単純なエンティティを作成します...
viewDidLoad に最初のエンティティを作成し、それへの参照を保存します....
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
id delegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];
// Create initial external file
_testEntity = [NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:managedObjectContext];
UIImage *planeImage = [UIImage imageNamed:@"plane.jpg"];
_testEntity.image = [NSData dataWithData:UIImagePNGRepresentation(planeImage)];
[delegate saveContext];
}
次に、ビューのボタンのアクション ハンドラーで、画像を変更するだけです...
-(IBAction)onTestImageButton:(id)sender { int randNum = rand() % 4 + 1;
id delegate = [[UIApplication sharedApplication]delegate]; // Store image - again UIImage *planeImage = [UIImage imageNamed:[NSString stringWithFormat:@"plane %d.jpg", randNum]]; _testEntity.image = [NSData dataWithData:UIImagePNGRepresentation(planeImage)]; [delegate saveContext]; }
ここでは、それぞれわずかに異なるサイズの 4 つの大きな jpg の平面があります。(サイズが同じであれば問題ありません)
アプリを実行し、「テスト」ボタンを数回押します。まもなく、ファイルのいくつかのバージョンが _EXTERNAL_DATA に表示されます
バージョンは 1 つしかないと思います。画像は孤立し、親エンティティがカスケード削除ルールを介してこれを削除すると、貴重なスペースを占有するファイルが残されます!
これはバグですか、それとも何か間違っていますか?
ありがとう