Apple fait cela dans une méthode setter pour une instance mainSprocket variable:Pourquoi devrais-je envoyer -autorelease à ma variable d'instance dans ma méthode setter, plutôt que -release?
– (void)setMainSprocket:(Sprocket *)newSprocket {
[mainSprocket autorelease];
mainSprocket = [newSprocket retain];
return;
}
Pourquoi ils n'envoyer -autorelease et non -RELEASE? Une libération aurait-elle un mauvais effet ici? En fait, cela ne devrait pas (pour autant que je sache), car la -release dit simplement que l'objet courant détenu par la variable d'instance mainSprocket n'est plus utilisé par cette variable d'instance. Dans le cas où quelqu'un d'autre est toujours intéressé par exactement cet objet, cette méthode pourrait le retenir, non? Donc, la libération devrait être bien, je pense?
Merci. Mais si ce n'est pas le même objet, et j'appelle cette méthode plusieurs fois, est-ce que je n'aurais pas de problèmes avec le pool autorelease? Parce que la piscine peut être vidangée uniquement dans la fonction principale de l'application? – Thanks
Vous pouvez vider vous-même le pool d'autorelease si vous travaillez dans une fonction où de nombreux objets sont créés. –
Si le flux de programme que vous êtes en train de construire appelle la fonction plusieurs fois, vous pouvez utiliser l'une des autres stratégies d'Apple pour les setters, plutôt que de les verbatim à partir de leur exemple simple que vous citez. Soit mettre en place une réserve automatique d'autorelease et la vidanger vous-même (ou vider le pool autorelease principal manuellement, comme le suggère gs), soit ne pas utiliser autorelease ... utiliser soit la vérification d'identité if soit la retenue de sécurité suggérée par gs. L'approche que vous prenez dépend entièrement de vos besoins. –