AFNetworking: безопасно ли обращаться к переменным вне блока? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь отладить проблему при хранении переменной вне блока.

- (void) setObj : (NSString *) abc {
    [self postURL:@"..." params:@{"abc" : abc} completionHandler:^(id response) {

        [[SharedPref sharedInstance] setX:response];
        [[SharedPref sharedInstance] setAbc:abc]; <-- can we safely do this?

    } failureHandler:^(SBError *error) {

    }];
}

Я видел случаи, когда в более позднее время я пытаюсь получить доступ к abc, я получаю пустую строку.

[[SharedPref sharedInstance] getAbc]; <-- this return empty string

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Нет ничего плохого в том, что вы делаете. Локальная переменная abc (которая является указателем на объект) захватывается блоком, а abc внутри блока будет указателем на тот же объект. Предполагая, что это неизменяемая строка или вы никогда не изменяете строку, она должна быть той же самой строкой, которая передается в setAbc:.

Учитывая, что postURL: является асинхронной операцией (т. Е. Блок завершения вызывается через некоторое неопределенное время позже), я подозреваю, что вы делаете ложные предположения о порядке операций. Блок завершения, который делает setAbc:, возможно, еще не был вызван к тому времени, когда вы делаете getAbc, и поэтому вы получаете начальное значение перед его установкой.

0 голосов
/ 17 мая 2018

Это должно быть безопасно, если свойство abc в SharedPref равно strong или copy.Для типов NSString* предпочтительно использовать copy.

@interface SharedPref : NSObject
@property (copy,nonatomic) NSString* abc;
@end

. Разница в следующем:

strong:

  • strong указывает, что класс владеет свойством

  • strong увеличивает счетчик ссылок свойства на 1

  • Экземпляр

    не будет выпущен, пока его счетчик ссылок не станет 0.

copy

  • назначений копированиямелкая копия при назначении свойства путем вызова [copy]

  • copy гарантирует, что вы всегда имеете дело с неизменным свойством.Если передано изменяемое свойство, оно скопирует его.Если передано неизменное свойство, оно сохранит его (вам необходимо его освободить).

...