I am getting crashes on very simple object access after upgrading to iOS 13. See examples below. I wonder if there is some change to the language or to default settings in Xcode causing these? Or maybe there is something fundamental that I don't understand about how properties are managed? This code has been reliable for a few iOS versions until now.
EXAMPLE 1: The following snipped crashes when printing _iCloudRoot:
_iCloudRoot = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (_iCloudRoot != nil) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"iCloud available at: %@", _iCloudRoot);
completion(TRUE);
});
}
Here is the property declaration:
@property(nonatomic, strong) NSURL * iCloudRoot;
EXAMPLE 2: The following snippet crashes when accessing calling NSURL.path on an object returned through the two member methods
- (NSURL *)localRoot {
if (_localRoot == nil) {
NSArray * paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
_localRoot = [paths objectAtIndex:0];
}
return _localRoot;
}
- (NSURL *) documentsFolderPath {
if(_forcedDocRoot) {
return _forcedDocRoot;
} else if (self.iCloudAvailable && self.iCloudOn) {
return [self.iCloudRoot URLByAppendingPathComponent:@"Documents" isDirectory:YES];
} else {
return self.localRoot;
}
}
- (void)loadLocal {
// this crashes on [docRoot path] below...
NSURL *docRoot = [self documentsFolderPath];
if(!docRoot) {
NSLog(@"no doc root!");
return;
}
// this prevents the crash on [docRoot path] below...
// NSArray * paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
// NSURL *docRoot = [paths objectAtIndex:0];
NSString* filePath = [docRoot path];
Here is the property declaration:
- (NSURL *) documentsFolderPath;
@property(nonatomic, strong) NSURL * localRoot;
Thanks!