Il problema con +alloc
è che mantiene il suo risultato, motivo per cui deve essere bilanciato con una chiamata a -release
o -autorelease
in seguito. Per evitare di digitare ogni volta che viene utilizzata una classe, i progettisti di API creano comunemente il cosiddetto convenienza costruttore o metodo di convenienza. +URLWithString:
è uno di loro, ed internamente sembra che questo:
+ (id)URLWithString: (NSString *)str {
return [[[self alloc] initWithString: str] autorelease];
}
Così +alloc
è sempre chiamato per voi, e così è -autorelease
.
Sfondo
Ci sono due grandi tipi di metodi in Objective-C: metodi di classe e metodi di istanza. I metodi di classe vengono inviati a una classe e non richiedono la creazione di un'istanza di tale classe. I metodi di istanza vengono inviati a un'istanza e possono accedere alla memoria occupata dall'istanza. I metodi di classe iniziano con +
; metodi di istanza con -
.
+alloc
è un metodo di classe. Non è magico con particolari poteri di creazione di oggetti. Tutto ciò che fa internamente è qualcosa di simile:
+ (id)alloc {
id result = malloc(class_getInstanceSize(self));
if (result) {
memset(result, 0, class_getInstanceSize(self));
result->isa = self;
result->retainCount = 1;
}
return result;
}
(In realtà è un po 'più complicato di così, ma dovrebbe essere sufficiente qui.) Nota che +alloc
è definito come parte di NSObject
, non parte di tutti gli oggetti. La gestione della memoria del cacao, con +alloc
, -init
, -retain
, -release
, ecc. Non è sempre parte di Objective-C e si possono creare oggetti che non la usano.
È possibile creare istanze di una classe senza chiamare +alloc
se si conoscono i giusti incantesimi. Non lo raccomanderei.
fonte
2011-11-06 14:12:59
@jrturton: come ho detto, sì ho e non ha molto senso per me, di solito ottengo buone spiegazioni qui, quindi ho pensato che qualcuno potesse dare una buona risposta. La documentazione degli sviluppatori Apple è orribile e si sa che è orribile. Si prega di dare risposte reali alle domande quando si risponde alle mie cose. lo apprezzerei. – gcoleman0828
In nessuna parte della tua domanda dici qualcosa riguardo alla lettura della documentazione o delle parti con cui hai problemi. Non essere così difensivo! – jrturton