Een vreemd probleem dat ik ben tegengekomen bij het proberen te begrijpen wat Apple's normen voor geheugenbeheer zijn. Laten we zeggen dat ik een methode heb die een kopie retourneert zonder dat de gebruiker weet dat het een kopie is.
+(Point2D*) Add:(Point2D*)a To:(Point2D*)b
{
Point2D * newPoint = [a copy];
[newPoint Add:b];//Actually perform the arithmetic.
return [newPoint autorelease];
}
Het probleem is dat de Analyseerfunctie van Xcode dit markeert als een object dat te veel -autorelease-oproepen wordt verzonden. Ik ga ervan uit dat dit komt omdat -copy impliciet veronderstelt dat je het eigendom neemt, en dus is de kans op +0 behouden waarschijnlijk. Maar ik ben niet helemaal zeker.
Analyse-informatie van Xcode
+(Point2D*) Add:(Point2D*)a To:(Point2D*)b
{
Point2D * newPoint = [a copy];//<- 1. Method returns anobjective-cobject with a +0 retain count.
[newPoint Add:b];
return [newPoint autorelease];//<- 2. Object sent -autorelease method.
//<- 3. Object returned to caller with a +0 retain count.
//<- 4. Object over -autoreleased: object was sent -autorelease but the object has zero (locally visible) retain counts.
}
Eventuele tips of hints over waarom dit gebeurt? Tenzij ik iets mis, zou de code goed moeten werken omdat de autorelease niet tot een veilige tijd zal worden geactiveerd (d.w.z. het werkt een beetje als een geriefsconstructeur, de gebruiker heeft tijd om te behouden.)
Vanaf verzoek zou -copyWithZone: als zodanig geïmplementeerd:
-(id)copyWithZone:(NSZone *)zone
{
return [[Point2D allocWithZone:zone] initX:x Y:y Z:z];
}