J'essaie de comprendre la bonne façon d'obtenir un NSString
d'un CFStringRef
en ARC? Pareil pour aller dans la direction opposée, CFStringRef
à NSString
en ARC?
Quelle est la bonne façon de procéder sans créer de fuites de mémoire?
J'essaie de comprendre la bonne façon d'obtenir un NSString
d'un CFStringRef
en ARC? Pareil pour aller dans la direction opposée, CFStringRef
à NSString
en ARC?
Quelle est la bonne façon de procéder sans créer de fuites de mémoire?
Généralement
NSString *yourFriendlyNSString = (__bridge NSString *)yourFriendlyCFString;
et
CFStringRef yourFriendlyCFString = (__bridge CFStringRef)yourFriendlyNSString;
Maintenant, si vous voulez savoir pourquoi l' __bridge
mot-clé est là, vous pouvez vous référer à la documentation d'Apple. Vous y trouverez:
__bridge
des transferts d'un pointeur entre Objective-C et le Fondement de Base avec aucun transfert de propriété.
__bridge_retained
ouCFBridgingRetain
jette un Objectif-C pointeur vers un Fondement de Base de pointeur et aussi des transferts de propriété pour vous. Vous êtes responsable de l'appel CFRelease ou une fonction liée à renoncer à la propriété de l'objet.
__bridge_transfer
ouCFBridgingRelease
se déplace d'une non-Objective-C pointeur à l'Objective-C et aussi en transfère la propriété à l'ARC. L'ARC est responsable de renoncer à la propriété de l'objet.
Ce qui signifie que dans les cas ci-dessus vous sont moulage de l'objet sans modifier la propriété. Cela implique que dans les deux cas, vous serez en charge de la gestion de la mémoire des chaînes de caractères.
Il peut également être le cas dans lequel vous souhaitez transférer la propriété pour une raison quelconque.
Par exemple, considérons le fragment de code suivant
- (void)sayHi {
CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);
NSString * aNSString = (__bridge NSString *)str;
NSLog(@"%@", aNSString);
CFRelease(str); //you have to release the string because you created it with a 'Create' CF function
}
dans ce cas, vous souhaiterez peut-être enregistrer un CFRelease
par transfert de propriété lors de la coulée.
- (void)sayHi {
CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);
NSString * aNSString = (__bridge_transfer NSString *)str;
// or alternatively
NSString * aNSString = (NSString *)CFBridgingRelease(str);
NSLog(@"%@", aNSString);
}
La propriété de l' str
a été transféré, alors maintenant, ARC en scène et de libérer la mémoire pour vous.
À l'inverse, vous pouvez jeter un NSString *
d'un CFString
à l'aide d'un __bridge_retained
plâtre, de sorte que vous serez propriétaire de l'objet et vous aurez à le libérer explicitement en utilisant CFRelease
.
Pour conclure, vous pouvez avoir
// Don't transfer ownership. You won't have to call `CFRelease`
CFStringRef str = (__bridge CFStringRef)string;
// Transfer ownership (i.e. get ARC out of the way). The object is now yours and you must call `CFRelease` when you're done with it
CFStringRef str = (__bridge_retained CFStringRef)string // you will have to call `CFRelease`
// Don't transfer ownership. ARC stays out of the way, and you must call `CFRelease` on `str` if appropriate (depending on how the `CFString` was created)
NSString *string = (__bridge NSString *)str;
// Transfer ownership to ARC. ARC kicks in and it's now in charge of releasing the string object. You won't have to explicitly call `CFRelease` on `str`
NSString *string = (__bridge_transfer NSString *)str;
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.