NSURLIsExcludedFromBackupKey在iOS 5.1之前崩溃

像许多iOS开发人员一样,在使用NSURLIsExcludedFromBackupKey之前,我遇到了5.1之前系统崩溃的问题。

在这个线程中很好地描述了如何评估这个键的存在:

在iOS 5.0上使用NSURLIsExcludedFromBackupKey不会崩溃

samvermette的评论之一说,在iOS模拟器中有一个错误。

不过,即使在2个独立的应用程序中,我也遇到了与发布版本相同的问题。 经过一番调查后,我发现应用程序在main()方法被调用之前崩溃了。 这暗示了这是与之相关的

NSString * const NSURLIsExcludedFromBackupKey;

应用程序启动评估。

我不是这个领域的专家,但是我发现,如果在代码中出现任何对const值的引用(即使它在运行时没有被实际访问),这个const在非常应用程序启动时被评估。 这只是导致我们许多人遇到的崩溃。

我想问你一些帮助。 也许你知道如何“微弱地”引用一个常量值,或者是有特定的编译器标志。 (使用Apple LLVM 3.1)。

提前致谢。

在这种情况下请不要直接放置这个const值,即“NSURLIsExcludedFromBackupKey”。 我意识到这个解决方法,对此故事的共鸣是find一个通用的解决scheme。

您可以在系统<5.0.1上使用此代码

 #include <sys/xattr.h> - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { const char* filePath = [[URL path] fileSystemRepresentation]; const char* attrName = "com.apple.MobileBackup"; u_int8_t attrValue = 1; int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); return result == 0; } 

在这里阅读更多。

编辑

如果你只是问如何检查一个外部常量的可用性,你可以将它的地址与NULL或nil进行比较。 这是推荐的方式 。

 if (&NSURLIsExcludedFromBackupKey) { // The const is available } 

我find了一个解决scheme,感谢https://stackoverflow.com/a/9620714/127493

 NSString * const NSURLIsExcludedFromBackupKey; 

即使Base SDK设置为iOS 5.1,也不是弱链接的,这与SDK兼容性指南中提到的不同。

诀窍是使用这个const的结果。
如果我做

 NSLog(@"%@", NSURLIsExcludedFromBackupKey); 

结果是@"NSURLIsExcludedFromBackupKey"

所以我的结果代码是

 #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) NSError * error = nil; BOOL success; if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.1")) { success = [storeURL setResourceValue:[NSNumber numberWithBool:YES] forKey:@"NSURLIsExcludedFromBackupKey" error:&error]; }