Объект с подсчетом ссылок используется после предупреждения об освобождении

Я получаю предупреждение для следующего кода:

NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);

// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];

После того, как я выпущу contactInfo, я больше не буду ссылаться на него, поэтому я не очень понимаю предупреждение.


person Peter Warbo    schedule 25.02.2013    source источник


Ответы (2)


Мостовое приведение передает что-то под контроль 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 *.

person Dietrich Epp    schedule 25.02.2013

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);
person Thilina Hewagama    schedule 25.02.2013