1

根据崩溃日志,我有一个应用程序在启动时崩溃,同时检查用户是否在设备上登录 Facebook。问题是我无法重现此崩溃,并且它发生在不同的设备上。到目前为止,我只在 iOS 6 之前的操作系统中看到过这种崩溃。我的应用程序支持的最早的 iOS 是 4.3。

这是代码,如果有人可以提供有关此方法有时会失败的原因(而且大多数时候不会!)

我得到的错误是 EXC_BAD_ACCESS (SIGSEGV);KERN_INVALID_ADDRESS 在 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,所以检查的第二部分OR没有被评估,因为第一个已经返回YES

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]

您可能希望将这些 if 语句更改为:

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

这确保SLComposeViewController只有在类实际存在时才使用它。

于 2012-12-03T17:54:30.847 回答