2010-05-17 8 views
3

J'étudie le projet iPhone Objective-C avec l'analyseur statique LLVM/Clang. Je continue d'avoir deux bogues rapportés, mais je suis assez sûr que le code est correct.Bug LLVM/Clang trouvé dans la méthode pratique et NSClassFromString (...) alloc/release

1) Méthode pratique.

+ (UILabel *)simpleLabel 
{ 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 200, 25)]; 
    label.adjustsFontSizeToFitWidth = YES; 
    [label autorelease]; // Object with +0 retain counts returned to caller where a +1 (owning) retain count is expected. 
    return label; 
} 

2) Le [NSClassFromString (...) alloc] retourne retainCount + 1. Ai-je raison?

Class detailsViewControllerClass = 
    NSClassFromString(self.detailsViewControllerName); 

UIViewController *detailsViewController = 
    [[detailsViewControllerClass alloc] 
     performSelector:@selector(initWithAdditive:) withObject:additive]; 

[self.parentController.navigationController 
    pushViewController:detailsViewController animated:YES]; 
[detailsViewController release]; // Incorrect decrement of the reference count of an object is not owned... 

Est-ce que ce sont quelques problèmes de Clang ou je me trompe totalement dans ces deux cas?

Répondre

2

Votre code semble correct dans les deux cas. Pour non. 2, vous êtes probablement confondre l'analyseur en utilisant performSelector au lieu de plain initWithAdditive (y a-t-il une raison particulière pour laquelle vous utilisez un sélecteur?). Je ne suis pas sûr de non. 1, mais essayez peut-être de l'initialiser avec [[[UILabel alloc] init...] autorelease] au lieu d'auto-leasing séparément, et voir si le problème persiste.

+0

Merci. Le cas n ° 2 résolu, il semble que l'analyseur était vraiment confus par le code précédent. Devrait être: UIViewController * detailsViewController = [[detailsViewControllerClass alloc] initWithAdditive: additive]; Le cas n ° 1 n'est toujours pas résolu. – pirags

+0

Le cas n ° 1 est assez mystérieux. Ce message d'erreur se produit généralement lorsque vous nommez mal les méthodes (par exemple en nommant une méthode 'newFoo' sans retourner un objet conservé). Je ne vois rien qui puisse le provoquer dans votre code. Cela pourrait être un bug dans l'analyseur. – shosti

+0

Est-ce que le problème dans le cas 1 disparaît si vous collez autorelease sur le init ou le retour? Quoi qu'il en soit, vous devriez signaler le bug à Apple - http://bugreporter.apple.com – JeremyP