Platné využití přístupové v init a dealloc metod?

hlasů
24

Slyšel jsem, že se z několika zdrojů (stackoverflow.com, kakao-dev, dokumentace, blogy, atd), že to je „špatně“ používat přístupové a nastavení (foo, setFoo :) ve vašem init a dealloc metod. Chápu, že je zde existuje nepatrná možnost matoucí další předměty, které jsou pozorování vlastnost, pokud tak učiníte. (jednoduchý příklad je uveden zde )

Musím však říci, že nesouhlasím s touto praxí z těchto důvodů:

Nový Objective-C runtime (ten na iPhone a 64-bit runtime v 10,5) vám umožňuje deklarovat vlastnosti , aniž by se prohlašuje odpovídající Ivar. Například následující třída sestavit pohodě na 10,5 nebo iPhone (zařízení, která nejsou simulátoru):

@interface Foo : NSObject { }

  @property (retain) id someObject;

@end

@implementation Foo

  @synthesize someObject;

@end

Pochopení, že výše uvedené je dokonale platný třída Objective-C, řekněme, že jsem se rozhodl napsat inicializátor, a pro účely správy paměti, způsobu dealloc (od GC není k dispozici na iPhone). Všechno, co jsem kdy četl o Inicializátory a deallocation by mě vedou k napsání následujících dvou metod:

- (id) init {
  if (self = [super init]) {
    //initialize the value of someObject to nil
    [self setSomeObject:nil];
  }
  return self;
}

- (void) dealloc {
  //setting someObject to nil will release the previous value
  [self setSomeObject:nil];
  [super dealloc];
}

Nicméně, podle dokumentace a veřejného mínění, je to „špatný“. Takže moje otázky jsou následující:

  1. Jak mám k inicializaci someObject bez použití přístupový? Dalo by se říci, že kompilátor (nebo runtime nebo cokoliv) zajistí, že someObject je již nastavena na nulu, ale věřím, že by bylo nevhodné chování, které se spoléhají na to. Mít slušné zázemí v C, viděl jsem spravedlivý množství chyb z důvodu nesprávně při inicializaci proměnných, a to se zdá trochu jinak.
  2. Jak mohu uvolnit someObject jestli bych neměla používat přístupový v metodě dealloc?

Je-li odpověď na jednu z nich je „nelze“, tak jak to může být špatné používat přístupové ve vašich init a dealloc metod?

Položena 16/08/2009 v 05:08
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
9

EDIT (13 února 2013): Jak je uvedeno v níže můj komentář, a zejména proto, že přidáním ARC jsem změnil svůj názor na toto téma. Před ARC, viděl jsem spoustu chyb crash-působit z důvodu chybných Ivar přidělení v init. IMO, zejména práci s juniorské týmy, vzácné problémy s pomocí přístupové oblasti initbyly převáženy běžných chyb přístupu Ivar. Vzhledem k tomu, ARC odstranila tyto druhy chyb, vzácné, ale možném chyby, které používáte přístupový do initmohou způsobit, jsou mnohem důležitější, a tak jsem přešel k podpoře přímé použití Ivars v inita dealloc, a to pouze v těch místech; přístupové všude jinde, že je to možné (samozřejmě nelze použít přístupové uvnitř samotného přístupový ....)


PRE-ARC odpověď

Já nesouhlasím s těmi, kdo mají námitky proti přístupové v -init. Téměř ve všech případech se jedná o velmi dobré místo k použití přístupové, a to ušetří spoustu chyb, které jsem viděl v nových Kakaové programátory, kteří stále nedokážou udržet při přiřazování v -init.

-deallocJe tvrdší výzva. Mám přirozený sklon používat přístupové tam (tak, aby byly používány všude), ale to může způsobit bolesti hlavy v důsledku KVO (nebo dokonce NSNotifications pokud jste po oznámení o změně ve svém setra). To znamená, že když jsem se nepoužívají přístupové oblasti -dealloc, považuji za velmi diskutabilní a Apple je velmi nekonzistentní o tom (víme, že voláte setView:v UIViewController je -deallocnapříklad).

V každém případě bych řekl, že nedostatečné využívání přístupové způsobil 100x chyby nadměrné užívání. Já bych vždycky bloudí k jejich použití kromě případů, kdy existuje silná důvod, proč.

Odpovězeno 17/08/2009 v 06:03
zdroj uživatelem

hlasů
8

Chápu, že současná 10.5 chování, v nichž se syntetizované Ivars nejsou přímo přístupné považuje Apple být chyba; měli byste být schopni to přímý přístup, ale nejde to.

Z tohoto důvodu byste měli být schopni udělat:

someObject = nil;

namísto

self.someObject = nil;

Do té doby, s použitím přístupový přímo je jediný způsob, jak to udělat, aniž by poskytující explicitní Ivar.

Aktualizace : Tato chyba byla opravena; nyní můžete udělat someObject = nilv pohodě.

Odpovězeno 16/08/2009 v 05:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more