2015-04-27 14 views
8

Ho spento ARC.Perché nessuna perdita di memoria per: @property (copia) nome NSString *, quando non lo rilascio in dealloc?

ho una proprietà in una classe dichiarata come questo:

@property(copy) NSString* name 

ho impostato name con una stringa costante:

[greeter setName:@"Jane"]; 

ho implementato dealloc per la mia classe come questa:

-(void)dealloc{ 
    [super dealloc]; 
} 

Mi aspettavo che ci fosse un promemoria fuga perché non ho rilasciato name. Sto usando Xcode 6.2 e Product>Analyze non identifica alcuna perdita, e nemmeno Instruments: Product>Profile, choose Leaks, hit the red Record button.

Ecco il codice rilevante:

// 
// Greeter.h 
// Flashlight2 
// 

#import <Foundation/Foundation.h> 

@interface Greeter : NSObject 

@property(copy) NSString* name; 

-(NSString*)description; 
-(void)dealloc; 


@end 

....

// 
// Greeter.m 
// Flashlight2 
// 

#import "Greeter.h" 

@implementation Greeter 


-(NSString*)description { 
    NSString* msg = [[NSString alloc] initWithString:@"I am a Greeter"]; 
    return [msg autorelease]; 
} 

-(void)dealloc{ 
    [super dealloc]; 
} 

@end 

...

@implementation AppDelegate 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // Override point for customization after application launch. 

    Greeter* greeter = [[Greeter alloc] init]; 
    [greeter setName:@"Jane"]; //constant string in memory for life of program 

    NSLog(@"%@", greeter); 
    [greeter release]; 


    return YES; 
} 

Dopo averci pensato per un po ', l'unica spiegazione che ho può venire fuori è che il name setter non in realtà copia la stringa costante. Sembra che Obj-C esegua un controllo di tipo su the string being assigned nella proprietà, e poiché è una stringa costante, Obj-C assegna (?) the-pointer-to-the-constant-string allo name-pointer. Sta succedendo qualcosa del genere?

+0

Questo non è correlato alla tua domanda ma con un tag di ios8 Suppongo che tu non abbia a che fare con il codice pre-ARC legacy quindi sono curioso di sapere perché vorresti disattivare ARC? – Rog

+3

@ Rog, per informazioni sulla gestione della memoria. – 7stud

+0

Sì, è l'unica buona ragione per cui potrei pensare :) – Rog

risposta

10

Ci sono due ottimizzazioni al lavoro che combinano questo risultato.

Primo: i valori letterali NSString vengono memorizzati in un segmento speciale del binario anziché allocati in fase di esecuzione. Ignorano il mantenimento e il rilascio e non vengono mai assegnati o deallocati.

Secondo: la copia di una NSString immutabile (inclusa una stringa letterale) invece la mantiene semplicemente, poiché la copia sarebbe sempre stata identica all'originale. (Ciò viene eseguito sovrascrivendo i metodi -retain e -release nella sottoclasse NSString privata)

Quindi, nel tuo scenario, la copia diventa un retain, il retain viene ignorato e la deallocation non si verifica anche se tu ha rilasciato correttamente la stringa in dealloc.

Problemi correlati