从块内传递NSString到方法时的EXC_BAD_ACCESS

时间:2014-09-22 16:17:17

标签: ios objective-c memory-management nsstring objective-c-blocks

我有一个请求访问Twitter的方法,然后使用- (void) setUsername:(NSString *)username设置用户名。我必须传递ACAccountStore.requestAccessToAccountsWithType...一个完成处理程序(块),如下所示:

[self.accounts requestAccessToAccountsWithType:twitterAccountType options:NULL completion:^(BOOL granted, NSError *actualError) {
    if(granted == YES) {
        self.haveTwitterAccess = YES;
        ACAccount *account = [self.accounts accountsWithAccountType:twitterAccountType][0];
        [self setUsername: account.username];

// [...]

但是,当我执行此操作时,我会在EXC_BAD_ACCESS方法中获得setUsername(我正在尝试传递account.username)。如果我尝试NSLog(@"%@", account.username);,那么我可以看到该值是正确的,但当传递给setUsername时,username变量为nil

我想它会在这里的某个线程之间发布,但我不确定,所有这些新的ARC内容是什么,如何阻止它发生。从本质上讲,这归结为我猜想在线程之间传递字符串?

我尝试了[account.username copy]之类的内容并将帐户存储设置为retain等,但似乎没有任何效果。我还尝试使用:

引用self
__block UserManager *blockSafeSelf = self;

如何确保保留从回调块传递到另一个对象上的方法的变量?

编辑:

这是一个名为UserManager的类,它有一个属性

@property (nonatomic) ACAccountStore *accounts;

处理Twitter访问。它还有方法:

- (void) setUsername: (NSString *) username;

我正在尝试使用完成块内的帐户用户名来调用。我希望这有助于更好地确定问题。

编辑(2):

usernameUserManager的属性,声明如下:

@property (nonatomic) NSString *username;

0 个答案:

没有答案