explication CLang

jannold2

Membre confirmé
11 Avril 2007
55
0
40
Bonjour à tous

j'essaye CLang sur les conseils d'un ami.
est ce que vous pourriez m'aider à déchiffrer cette erreur svp :

A:
Bloc de code:
#import "A.h"

@implementation A

-(id) init {
    if (self = [super init])
        ;
    return self;
}
@end

B.h
Bloc de code:
#import <Cocoa/Cocoa.h>
#import "A.h"

@interface B : A {
    A* toto;
}

-(id) init;
-(id) init_with:(A*) aa;

@end

B.m
Bloc de code:
#import "B.h"

@implementation B

-(id) init_with:(A*) aa {
    if (self = [super init]) {
        if (toto != aa) {
            [toto release];
            toto = [aa retain];
        }
    }
    return self;
}

-(void) dealloc {
    [toto release];
    [super dealloc];
}
@end


main
[CODE]

#import <Cocoa/Cocoa.h>
#import "A.h"
#import "B.h"

int main(int argc, char *argv[]) {
    A* a = [[A alloc] init];
    B* b = [[B alloc] init_with:a];

    [a release];
    [b release];
   return NSApplicationMain(argc,  (const char **) argv);
}


l'analyseur me dit qu'il y a une erreur à la création de b
Method returns an Objective-C object with a +0 retain count (non-owning reference)

et une autre au moment du release de b.
Incorrect decrement of the reference count of an object is not owned at this point by the caller


seulement je m'arrache les cheveux et ne comprends pas

en effet, si je remplace init_with:(A*) aa par un init seul (le même que dans A), et que j'ai une méthode setToto:(A*) aa { iff (toto != aa) [toto release] toto =[aa retain]}
et que je fais ça, je n'obtiens plus d'erreur, alors que ça m'a tout l'air d'être le même code... ????


je serais ravi de comprendre ce qui se passe
merci d'avance
Thomas

---------- Nouveau message ajouté à 23h18 ---------- Le message précédent a été envoyé à 22h43 ----------

et information supplémentaire : si j'avais appelé ma fonction -(id) init:(A*) aa au lieu de init_with:(A*) aa, ça aurait marché


ce qui mène à une autre question ???
on ne peut plus nommer le premier argumetn de init alors ?
-(id) init: avec_a:(A*) aa;

est toléré dans l'interface, par contre on ne peut plus l'appeler !
B* b = [[B alloc] init: avec_a:aa]; interdit : 'avec_a' first use in this function


bref plus je crois comprendre moins je comprends... :(
aidez moi !! :) merci
 
Bloc de code:
if (toto != aa) {
[toto release];
}
Si le compteur d'instance de toto est à zéro, ça doit pas le faire. Teste aussi si toto est nil ou pas.
 
non, ça ne marche pas
et d'ailleurs si je change juste le nom de la fonction init_with_a:(A*) aa par init:(A*) aa, là je n'ai plus d'erreur
objective-c oblige donc les méthodes init à s'appeler init et non pas init_with_... ?
 
objective-c oblige donc les méthodes init à s'appeler init et non pas init_with_... ?
Non, il y a plein d'exemples dans Cocoa.
Par contre tu as déclaré une fonction init dans ton B.h qui n'est pas définie dans B.m

PS : le nom de fonctions avec "_" n'entre pas vraiment dans les règles de nommage habituellement suivie par Apple. ;)
 
merci pour ta réponse

j'y ai cru :) mais non, ce n'est toujours pas ça la solution
dommage ; mais je vais quand même arrêter de mettre des _ dans le nom de mes fonctions

le problème tient encore :

Bloc de code:
dans B:

-(id) initwithA:(A*) aa {
    if (self = [super init]) {
        if (toto != aa) {
            if (toto != nil)
                [toto release];
            toto = [aa retain];
        }
    }
    return self;
}


dans main :
    B* b = [[B alloc] initwithA:a];
    [b release];
[\CODE]

cela produit une erreur de CLang, alors que si j'avais appelé init la fonction initwithA cela ne produit pas d'erreur


une autre idée ??
 
J'ai créé un projet et repris ton code, et chez moi pas de problème, ça marche. J'ai juste remplacé le "return NSMain..." par un "return 0".
Es-tu sûr que ton erreur est à la création de b ?
 
bon ben... c'est peut être ma version de CLang (1.1.7) qui est différente alors, je ne vois pas trop d'explication
il doit y avoir une clause spéciale "fonction init" dans clang
si je comprends un jour ce qui se passe je l'écrirai ici

en tout cas merci ntx
Thomas