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?
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
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
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