Ho un'app per iPhone che sta ricevendo avvisi di memoria e quindi sto cercando di trovare perdite, fare un uso più efficiente della memoria, ecc., Con l'aiuto di Instruments. Tra le altre cose, sto cercando di eliminare qualsiasi oggetto autoreleased e di sostituirlo con oggetti alloc/init/release manuali. Tuttavia, alcune chiamate API non sembrano avere una versione "init" (vedi il codice sotto). Ho certamente avuto alcune incomprensioni di base:Utilizzo degli strumenti Perdite e oggetto Alloc: Gli oggetti autoreleased vengono conteggiati come perdite?
Se Sono mettere in 'l'API e tornare oggetti essenzialmente autoreleased, possono questi oggetti visualizzati come perdite nel Instruments? Sembra che io veda questo comportamento in Strumenti.
Se sì a 2, dovrei semplicemente ignorare se non esiste un'alternativa "non autorelease" e sto usando un'API di cui ho bisogno? Inoltre, se questo codice viene chiamato molto, dovrei ripensare completamente l'algoritmo?
Ecco un codice di utilità dalla mia applicazione che viene chiamato molto. Fondamentalmente determina se due date sono significativamente 'uguali'. Ho lasciato nel codice commentato in modo da poter vedere i tipi di miglioramenti che sto seguendo nella mia base di codice - questo DID ridurre le perdite di memoria quando successivamente eseguito in strumenti come ho iniziato a creare manualmente il NSDate (e rilasciare) che ha aiutato. Tuttavia, ho ancora gli oggetti componenti data che credo siano perdite ... ma è una chiamata API (scusate per la formattazione del codice, ma io non riesco a migliorarlo su SO):
+ (BOOL)isDayEqualToDay:(NSDate*)date anotherDate:(NSDate*)anotherDate
{
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//NSCalendar *cal;
NSDateComponents *componentsFromDate, *componentsFromAnotherDate;
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
//cal = [NSCalendar currentCalendar];
componentsFromDate = [cal components:unitFlags fromDate:date];
componentsFromAnotherDate = [cal components:unitFlags fromDate:anotherDate];
BOOL bDatesEqual = ([componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]);
[cal release];
return bDatesEqual;
/*
return (
[componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]
);*/
}
penso i componentiFromDate e componentsFromAnotherDate vengono visualizzati come perdite ma solo oggetti restituiti essenzialmente da una chiamata API NSData (autoreleased). Non so cos'altro potrei davvero fare per rendere questo più efficiente e sto mettendo in discussione la mia comprensione di come utilizzare gli strumenti. Suggerimenti?
Sembra che non ci sia modo di utilizzare gli strumenti per eseguire il debug di GDC. C'è forse un altro modo? –