UIDocument never calling dealloc

旧巷老猫 提交于 2019-12-23 19:45:24

问题


I have an issue where I can't seem to dealloc UIDocument (used in iCloud)

After running an NSMetaDataQuery to look for the document as follows..

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
_query = query;
[query setSearchScopes:[NSArray arrayWithObject:
                        NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate *pred = [NSPredicate predicateWithFormat: 
                     @"%K == %@", NSMetadataItemFSNameKey, kFILENAME];
[query setPredicate:pred];
[[NSNotificationCenter defaultCenter] 
 addObserver:self 
 selector:@selector(queryDidFinishGathering:) 
 name:NSMetadataQueryDidFinishGatheringNotification 
 object:query];

[query startQuery];

I process my query

- (void)queryDidFinishGathering:(NSNotification *)notification {

NSMetadataQuery *query = [notification object];
[query disableUpdates];
[query stopQuery];

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:NSMetadataQueryDidFinishGatheringNotification
                                              object:query];

_query = nil;

[self loadData:query];

}

Then load or create a new document.

- (void)loadData:(NSMetadataQuery *)query {

if ([query resultCount] == 1) {

    NSMetadataItem *item = [query resultAtIndex:0];
    NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];
    MyDocument *doc = [[[MyDocument alloc] initWithFileURL:url] autorelease];

    [doc openWithCompletionHandler:^(BOOL success) {
        if (success) {                
            NSLog(@"iCloud document opened %@", doc);
            [doc updateChangeCount:UIDocumentChangeDone];
        } else {                
            NSLog(@"failed opening document from iCloud");                
        }
    }];
} else {

    NSURL *ubiq = [[NSFileManager defaultManager] 
                   URLForUbiquityContainerIdentifier:nil];
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:
                                 @"Documents"] URLByAppendingPathComponent:kFILENAME];

    MyDocument *doc = [[[MyDocument alloc] initWithFileURL:ubiquitousPackage] autorelease];

    [doc saveToURL:[doc fileURL] 
  forSaveOperation:UIDocumentSaveForCreating 
 completionHandler:^(BOOL success) {            
     if (success) {
         [doc openWithCompletionHandler:^(BOOL success) {                
             NSLog(@"new document opened from iCloud");
             [doc updateChangeCount:UIDocumentChangeDone];
         }];                
     }
 }];
}
}

The NSLog(@"iCloud document opened %@", doc); shows a different memory address for each UIDocument.

I have an NSLog in my UIDocument subclass, it never gets called. I cannot see where it is being retained that I am not releasing it. This query is ran whenever I want to sync my cloud data, this happens fairly regularly. The data syncs correctly.

I am experiencing strange crashes where my app will simply close to the dashboard, with nothing in the debug (from previous experiences I know this often to be the app expending too much memory and being terminated.)

I think that my UIDocument is leaking, would I be correct in this assumption, this is the first time i've wrestled with iCloud so I'm still in the dark over a few things.

My subclass has the following properties:

@property (copy, nonatomic) NSData *infoData;
@property (copy, nonatomic) NSMutableArray *firstArray;
@property (copy, nonatomic) NSMutableArray *secondArray;
@property (copy, nonatomic) NSMutableArray *thirdArray;

I am not using ARC.


回答1:


I did not realise that I had to do this:

        [doc updateChangeCount:UIDocumentChangeDone];
        [doc closeWithCompletionHandler:nil];

Obviously if a file is open for writing, then it would not be wise to allow it to be deallocated!

Doh! Hopefully this saves someone some time in the future.



来源:https://stackoverflow.com/questions/11449530/uidocument-never-calling-dealloc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!