Static konstruktér ekvivalent v Objective-C?

hlasů
69

Jsem nový Objective C a já jsem nebyl schopen zjistit, zda existuje ekvivalent statický konstruktor v jazyce, který je statická metoda ve třídě, která bude automaticky volána před prvním stupni takového třídě instance. Nebo musím zavolat inicializace kód sám?

dík

Položena 14/06/2009 v 04:25
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
124

+initializeMetoda se nazývá automaticky na prvním použití třídy, než jsou použity jakékoli způsoby nebo třídy jsou vytvořeny instance. Nikdy byste neměli říkat +initializesám.

Také jsem chtěl projít podél pamlsek jsem se dozvěděl, že vás může kousnout dolů na silnici: +initializedědí podtřídy, a je také nazýván pro každý podtřídy, která nemá realizovat +initializejejich vlastní . To může být obzvláště problematické, když se naivně implementovat jedináčka inicializace +initialize. Řešením je zkontrolujte typ proměnné třídy, jako je takto:

+ (void) initialize {
  if (self == [MyParentClass class]) {
    // Once-only initializion
  }
  // Initialization for this class and any subclasses
}

Všechny třídy, které sestoupí z NSObject mít obojí +classa -classmetody, které vracejí Classobjektu. Vzhledem k tomu, že je pouze jeden objekt třídy pro každou třídu, chceme testovat rovnost s ==operátorem. Můžete použít k filtrování, co by se stalo jen jednou někdy versus jednou pro každou jednotlivou třídu v hierarchii (což může ještě neexistuje) pod danou třídu.

Na tangenciální téma, je to stojí za to seznámit se s následujícími souvisejícími metodami, pokud jste tak ještě neučinili:


Edit: Podívejte se na tento post by @bbum která vysvětluje více informací o +initialize: http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so- hodně/

Také Mike Ash napsal krásný detailní pátek Q & A o +initializea +loadmetod: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html

Odpovězeno 14/06/2009 v 19:10
zdroj uživatelem

hlasů
51

Tam je + inicializovat metodu třídy, která se bude jmenovat, než je použita třídou.

Odpovězeno 14/06/2009 v 05:58
zdroj uživatelem

hlasů
10

Trochu dodatku k tomuto tématu:

Tam je další způsob, jak vytvořit ‚statický konstruktor‘ v obj-c, pomocí __attributedirektivy:

// prototype
void myStaticInitMethod(void);

__attribute__((constructor))
void myStaticInitMethod()
{
    // code here will be called as soon as the binary is loaded into memory
    // before any other code has a chance to call +initialize.
    // useful for a situation where you have a struct that must be 
    // initialized before any calls are made to the class, 
    // as they would be used as parameters to the constructors.
    // e.g.
    myStructDef.myVariable1 = "some C string";
    myStructDef.myFlag1 = TRUE; 

    // so when the user calls the code [MyClass createClassFromStruct:myStructDef], 
    // myStructDef is not junk values.
}
Odpovězeno 05/01/2012 v 15:39
zdroj uživatelem

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