3

Les fuites suivantes:Comment puis-je éviter de laisser fuir cet objet Foundation?

CFStringRef labelName = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row)); 
    cell.textLabel.text = (NSString *)labelName; 
    CFRelease(labelName); 

Vous vous demandez s'il y a un moyen de le réécrire afin qu'il ne fuit pas sans sortir & attribuer ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row) à un CFStringRef que j'ai besoin alors manuellement CFRelease 2 lignes plus tard? Bien sûr, ce n'est pas une grosse affaire à faire ... Je suis juste curieux.

Modifier: Est-ce que CFAutoRelease fonctionnerait? voir mon commentaire ci-dessous

Répondre

2

En raison de la sémantique Copy/Get, vous devez sortir tout ce qui sort d'une API avec Copy. ABMultiValueCopyLabelAtIndex répond à cette exigence, donc, malheureusement, vous aurez besoin d'acquérir cette référence et le publier plus tard.

+1

Qu'en est-il de 'CFAutoRelease'? could 'CFStringRef nomEtiquette = ABAddressBookCopyLocalizedLabel (CFAutoRelease (ABMultiValueCopyLabelAtIndex (aMultiRef, indexPath.row)))' travail? – Meltemi

+1

Il n'y a pas de 'CFAutoRelease'; vous devriez stocker des références à tout ce que vous créez temporairement dans une variable locale et 'CFRelease' quand vous avez terminé. – rpetrich

+2

@rpetrich dans iOS7 SDK, il ya CFAutorelease dans CoreFoundation/CFBase.h – thandasoru

0

Vous pouvez libérer automatiquement en utilisant Objective-C (tant que vous avez un pool en place). Juste cast à id d'abord. Par exemple. [(id) labelName autorelease] fonctionnera correctement et est parfaitement légal (car CFStringRef est et sans lien avec NSString). Vous pouvez le faire avec n'importe quel type basé sur CoreFoundation, bien que je ne pense pas qu'Apple documente publiquement cela, alors en théorie, cela pourrait changer.