Ho un pezzo di codice Objective-C, che è simile al seguente:Come posso risolvere questo avvertimento di clang: "L'oggetto con +0 conserva i conteggi restituiti al chiamante in cui è previsto il conteggio di mantenimento +1 (proprietario)"?
- (NSString *)copyData:(NSData *)data
{
NSString *path = [[[self outputDirectory] stringByAppendingPathComponent:@"archive"] stringByAppendingPathExtension:@"zip"];
NSLog(@"Copying data to %@", path);
[data writeToFile:path atomically:NO];
return path;
}
Il codice viene chiamato da un inizializzatore che assomiglia a questo:
- (id)initWithData:(NSData *)data
{
if ((self = [super init]) != nil) {
NSString *path = [self copyData:data]; // Line 41 (referenced in warning, shown below)
return [self initWithContentsOfFile:path];
}
return self;
}
Quando si esegue l'analizzatore statico clang, ottengo le seguenti avvertenze per la path
variabile:
perdita potenziale di un oggetto allocato sulla linea 41 e memorizzati in 'percorso'
Oggetto con +0 mantenere i conteggi restituito al chiamante in cui uno (possedere) mantenere il conteggio è previsto
Sono confuso. La mia comprensione è che stringByAppendingPathComponent
dovrebbe restituire una stringa autoreleased, quindi dovrebbe avere una rete conservare conteggio di 0. (Ovviamente io non voglio di conservarlo.)
Ho cercato alterare copyData:
per tornare il seguente, ma non ha eliminato l'avviso:
return [[path retain] autorelease];
Quindi qual è l'accordo con questo avviso?
Questa risposta ha rimosso così tanti avvisi errati dal mio progetto! –