Domanda

Sto sviluppando giochi per iPad. Incontro questa cosa. Questo è il mio codice di esempio:

Metodo 1:

Foo.h

@interface Foo : UIView{
    UILabel *title;
    .... // Other objects like UISlider, UIbuttons, etc.
}

// I add @property for all the objects.
@property (nonatomic, retain) UILabel *title;

... blablabla

Foo.m
// I synthesize all the properties.
@synthesize title;
... blablabla

// Release in dealloc method
[title release];
....
[super dealloc];

Metodo 2:

Foo.h

@interface Foo : UIView{
    UILabel *title;
    .... // Others object like UISlider, UIbuttons, etc.
}
// But this time I didn't add @property, synthesize and release.

Foo.m
// When I need the label, I allocate it:
title = [[UILabel alloc] initWithRect: CGRect(10, 10, 100, 30)];
title.text = @"test";
[self addSubview: title];
[title release];

Entrambi i metodi 1 e 2 funzionano, ma qual è la differenza tra i 2 metodi (Method2 ha meno codice)?

Quale metodo dovrei usare e perché?

Ha qualcosa a che fare con la gestione della memoria?

È stato utile?

Soluzione

Il metodo 2 è tecnicamente errato poiché inviando -release Per titolo, indica che non sei più interessato a esso. Dovresti renderlo nulle subito dopo, o meglio ancora, renderlo una variabile locale.

Il metodo 1 va assolutamente bene e ha il vantaggio che, al di fuori di -dealloc a condizione che tu usi sempre la proprietà per fare riferimento ad essa, non devi preoccuparti di ottenere -retain e -release -Giusto.

Altri suggerimenti

La differenza è che, nel metodo 2, non avrai accesso al titolo dall'esterno dell'oggetto Foo. La variabile di istanza è privata alla classe.

Inoltre, con te devi assicurarti di bilanciare l'alloc di alloc/conservazione e rilascia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top