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?
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
@ Rog, per informazioni sulla gestione della memoria. – 7stud
Sì, è l'unica buona ragione per cui potrei pensare :) – Rog