4

多くの iOS 開発者と同様に、5.1 より前のシステムで を使用するとアプリケーションがクラッシュするという問題に遭遇しましたNSURLIsExcludedFromBackupKey

このスレッドでこのキーの存在を評価する方法については、よく説明されています。

iOS 5.0 でクラッシュせずに NSURLIsExcludedFromBackupKey を使用する

samvermette のコメントの1 つは、iOS シミュレーターにバグがあると述べています。

それにもかかわらず、2 つの別々のアプリケーションであっても、リリースビルドで同じ問題が発生しました。調査の結果、main() メソッドが呼び出される前にアプリケーションがクラッシュしたことがわかりました。これが関連していることを私にほのめかした

NSString * const NSURLIsExcludedFromBackupKey;

アプリケーション起動時の評価。

私はこの分野の専門家ではありませんが、const値への参照がコード内で発生した場合 (実行時に実際にアクセスされなくても)、constアプリケーションの起動時に評価されることがわかりました。そして、これは単に私たちの多くが経験するクラッシュを引き起こします.

どなたかお力添えをお願いしたいです。const値を「弱く」参照する方法を知っているかもしれませんし、特定のコンパイラフラグがあるかもしれません。(Apple LLVM 3.1 を使用)。

前もって感謝します。

この場合、@"NSURLIsExcludedFromBackupKey" であるこの const の値を直接入力するコメントはしないでください。私はこの回避策を知っています。この話の理由は、一般的な解決策を見つけることです。

4

2 に答える 2

1

このコードは、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
}
于 2012-05-17T12:33:22.280 に答える
1

https://stackoverflow.com/a/9620714/127493のおかげで解決策が見つかりました!

NSString * const NSURLIsExcludedFromBackupKey;

SDK 互換性ガイドに記載されているのとは異なり、Base SDK が iOS 5.1 に設定されていても、弱いリンクではありません。

トリックは、この 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];
}
于 2012-07-25T10:16:39.237 に答える