0

La méthode suivante prend un double pointeur vers NSString et renseigne cela avec une valeur, comme suit:La libération d'un retour par référence NSString provoque une panne

@implementation Exp 
- (int) func:(NSString**) dpStr 
{ 
    //------ 
    *dpStr = [self func_2]; 
    //------ 
} 

Maintenant, il est appelé comme ceci:

int main() 
{ 
    NSString * str = [[NSString alloc] init]; 
    int retCode = [Exp func:&str]; 
    // <----- Now here I'm able to access value returned by func -------> 

    [str release]; // <--- It is crashing here 
} 

Quelqu'un peut-il expliquer pourquoi il plante?

Répondre

4

Cette alloue une chaîne vide:

NSString * str = [[NSString alloc] init]; 

Cette remplace la valeur précédente de str avec une nouvelle chaîne qui est apparemment déjà autoreleased; l'ancienne valeur de str est une fuite:

int retCode = [Exp func:&str]; 

Cette tente de libérer la nouvelle valeur de str, qui est déjà équilibré, il est donc un overrelease et un accident se produit:

[str release]; 

Ni le +alloc/-init ni le -release de fin sont nécessaires dans ce cas, car l'objet est fourni par -func:. Tout ce que vous avez besoin est:

NSString *str = nil; 
[Exp func:&str]; 
// use str normally 

Il serait préférable de modifier -func: pour retourner la chaîne directement:

NSString *str = [Exp func]; 
// use str normally 

Ensuite, il n'y a pas besoin de passer par adresse.

+0

+1 pour répondre – MByD

+0

beaucoup mieux et détaillée Si je remplacerai NSString avec NSMutableString et ne suivant dans la fonction - (int) func: (NSMutableString **) dpStr { ------ [* dpStr setString: [self func_2]]; ------ } Ensuite, je suis capable de libérer de la mémoire en utilisant [str release]. Ce plaisir est défini dans la bibliothèque et je l'appelle amusant de mon application qui est liée statiquement avec cette bibliothèque Quelle approche est recommandée ... – macdev30

+1

L'approche recommandée est ce que j'ai décrit dans ma réponse. En Objective-C, vous n'avez pas besoin de fournir des tampons pour les chaînes et autres; le système d'exploitation le gère généralement pour vous. –

Questions connexes