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]; }
- 为什么简单的网站崩溃在移动(iOS Safari和至less)?
- 删除UICollectionView中的最后一个单元格会导致崩溃
- 请求用户在iPhone上崩溃后发送崩溃日志
- 显示UIPopOverPresentationController时崩溃
- iOS崩溃:由于未捕获的exception原因终止应用程序:UIPopoverPresentationController应该有一个非零的sourceView
- 更改为iOS6后,应用程序崩溃 – ucol_getVersion
- iOS 7应用程序崩溃EXC_CRASH(SIGABRT)objc_exception_throw在iOS 6上正常工作
- MonoTouch.Dialog崩溃
- NSObjectInaccessibleException',原因:'CoreData不能履行一个错误