Objectief-C Terugkerende automatisch kopieën

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];
}
2
Je code ziet er goed uit. Je zou de kopie moeten autoreleren. Welke versie van Xcode gebruikt u? In de mijne kan ik niet eens een type met de naam "Point" noemen, omdat het conflicteert met het type in QuickTime: developer.apple.com/library/mac/#documentation/QuickTime/…
toegevoegd de auteur user102008, de bron
Het moet een bug in je Xcode zijn. Probeer Xcode 4.3
toegevoegd de auteur user102008, de bron
Je hebt gelijk, ik gebruikte een algemene zaak en noemde het eenvoudig Point. In mijn code komt het voor in mijn Matrix3x3, Matrix4x4, Vector3, Vector4-klassen. Ik probeerde een algemene zaak te citeren voor de doeleinden van deze vraag. - Ik heb de vraag gewijzigd om Point2D te gebruiken om verdere verwarring te voorkomen. Ook gebruik ik Xcode 4.2 Build: 4C199
toegevoegd de auteur TReed0803, de bron
Bedankt, ik ga ervan uit dat het een fout is. Ik kan helaas niet veel meer doen om te testen, want ik gebruik Snow Leopard en kan niet upgraden naar 4.3 -:/Maar het feit dat ik consistent hoor dat dit is wat ik zou moeten doen en het zien van verschillende andere voorbeelden is genoeg . Als iemand kan bevestigen dat de code niet op 4.3 onjuist analyseert, dan ben ik blij dat ik dit compleet heb gemarkeerd. Bedankt!
toegevoegd de auteur TReed0803, de bron

1 antwoord

Implementeer -copyWithZone: (NSZone *) zone in uw Punt -klasse correct (of kopieer deze hier tenminste)

0
toegevoegd
ah, kijk: "Een subklasse-versie van de methode copyWithZone: moet het bericht eerst naar super verzenden om de implementatie ervan te integreren, tenzij de subklasse rechtstreeks van NSObject afstamt." (c) NSObject Class Reference van Apple. Probeer copyWithZone correct te implementeren.
toegevoegd de auteur Valentyn Kuznietsov, de bron
ontwikkelaar .apple.com/library/mac/# samplecode/& hellip; Download deze voorbeeldcode en probeer de copyWithZone-implementatie te bekijken (SKTGraphic van NSObject en SKTImage van SKTGraphic)
toegevoegd de auteur Valentyn Kuznietsov, de bron
Ik heb de originele post bewerkt om -copyWithZone :, bedankt voor de snelle reactie! - Opmerking: hiermee wordt het probleem met analyseren niet opgelost, omdat ik -copyWithZone: al geïmplementeerd had. :(
toegevoegd de auteur TReed0803, de bron
Zelfs nadat het is gewijzigd, wordt het nog steeds geanalyseerd als een mogelijk geheugenprobleem. Ik denk dat het een probleem kan zijn met mijn versie van XCode, maar ik kan niet upgraden omdat ik Snow Leopard gebruik. :/Leuk echter, ik zal copyWithZone vanaf nu implementeren. (Ik was me eigenlijk niet bewust van dit probleem.)
toegevoegd de auteur TReed0803, de bron