Я получаю предупреждение для следующего кода:
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
После того, как я выпущу contactInfo, я больше не буду ссылаться на него, поэтому я не очень понимаю предупреждение.
Ответ 1 · Dietrich Epp
Мостовое приведение передает что-то под контроль ARC или из него, но дает вам указатель, который, как предполагает ARC, сохраняется где-то еще.
Альтернатива 1 (уродливая)
Если вы используете обычный __bridge, вы не сможете освободить объект, пока не закончите с ним работать.
NSString *userMail = (__bridge NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);
Альтернатива 2 (хорошо)
Если вы используете __bridge_transfer, ARC отследит его для вас.
NSString *userMail = (__bridge_transfer NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
Резюме
Приведение __bridge следует использовать только для приведения типов с подсчетом ссылок к типам без подсчета ссылок. Например, между void * и NSString *. Вам нужно использовать его, например, для написания функций обратного вызова на C.
Преобразование __bridge_transfer позволит вам преобразовать один тип с подсчетом ссылок в другой, например, CFStringRef в NSString *.
Ответ 2 · Thilina Hewagama
userMail - это просто ссылка на ваш объект contactInfo. вызов userMail аналогичен вызову contactInfo. Здесь вы выпускаете contactInfo, а затем пытаетесь установить userMail (который является ссылкой на contactInfo) в качестве userMail для settingsHelper.
попробуй так,
NSString *userMail = (__bridge NSString *) contactInfo;
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);