1

クラッシュ ログによると、ユーザーがデバイスで Facebook にログインしているかどうかを確認しているときに、起動時にクラッシュするアプリがあります。問題は、このクラッシュを再現できず、別のデバイスで発生することです。これまでのところ、このクラッシュは iOS 6 より前のオペレーティング システムでしか発生していません。私のアプリでサポートされている最も古い iOS は 4.3 です。

このメソッドが時々失敗する理由についての手がかりを誰かが提供できる場合、コードは次のとおりです(そしてほとんどの場合は失敗しません!)

私が得るエラーは EXC_BAD_ACCESS (SIGSEGV);KERN_INVALID_ADDRESS at 0x00000000 です。

    + (BOOL)loggedIntoServiceOnDevice:(int)socialService {

        __ENTERING_METHOD__
        BOOL loggedIntoServiceOnDevice = NO;
        ACAccountStore *accountStoreHere = [[NSClassFromString(@"ACAccountStore") alloc] init];
        ACAccountType *accountType;
        ACAccountType *accountType2;

        if (accountStoreHere) {
            if (socialService == FACEBOOK_SERVICE) {

                ACAccountType *accountType = [accountStoreHere accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"];
                Class slComposeController = NSClassFromString(@"SLComposeViewController");
                if (accountType && slComposeController != nil)
                {
                    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {

                         loggedIntoServiceOnDevice = YES;
                    }
                }
            }
            else if (socialService == TWITTER_SERVICE) {
                ACAccountType *accountType = [accountStoreHere accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
                if (accountType)
                {
                    Class slComposeController = NSClassFromString(@"SLComposeViewController");
                    if ([TWTweetComposeViewController canSendTweet] || slComposeController != nil) {
                        if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {

                            loggedIntoServiceOnDevice = YES;
                        }
                    }
                }
            }
        }
        [accountStoreHere release];
        return loggedIntoServiceOnDevice;
    }
4

1 に答える 1

2

次の行も iOS 5 で実行されます。[TWTweetComposeViewController canSendTweet]が返されるため、最初の部分が既に返されているため、チェックYESの 2 番目の部分は評価されません。ORYES

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]

これらの if ステートメントを次のように変更したい場合があります。

if ([TWTweetComposeViewController canSendTweet] ||
    (
     slComposeController != nil &&
     [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]
    )
   ) {

これによりSLComposeViewController、クラスが実際に存在する場合にのみ使用されます。

于 2012-12-03T17:54:30.847 に答える