Po návratu jiné předměty na init

hlasů
3

Četl jsem na mnoha místech, které byste měli vždy inicializovat Objective-C objektů jako tak:

- (id) init {
    if (self = [super init]) {
        ....
    }
    return self;
}

Vzhledem k tomu, Super je initmetoda může vrátit samostatný objekt z proudu self.

Teď se snažím udělat něco takového, a nejsem si jistý, jestli to mám právo, vis-a-vis, jak udržet a uvolnění by mělo fungovat:

- (id) init:(int)idx {
    id obj = [Cache findSelf:idx];
    if (obj) {
        [self release];
        self = [obj retain];
    } else {
        self = [self doLoad];
    }
    return self;
}

Jsem hlavně zvědavý, jestli je to správný způsob, jak dělat uchovávat a uvolnění selfa obj. Existuje lepší způsob?

Položena 24/07/2009 v 17:06
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
7

Máte pravdu o self = [super init]straně, protože některé Kakaové třídy vlastně dělat vrátit jiný předmět, než je ten, který byl přidělen. To je však spíše výjimkou než pravidlem, a přitom ve svém vlastním kódu by měl být mimořádně vzácný nebo neudělala vůbec. Ačkoli to může být lákavé zachytit -initvolání, měli byste jít proti srsti zavedené konvence a jaké Objective-C programátoři očekávat, že kód má dělat.

Tento typ -init metody je obecně špatný přístup, protože -initmetody by měly být tak jednoduché, jak je to možné, a měly by být opravdu zabývá inicializaci objektu. Asi bych napsat metodu smíšeného takto:

+ (id) instanceForIndex:(NSUInteger)index {
    id obj = [Cache findSelf:index];
    if (obj == nil) {
      obj = [[self alloc] init];
      // Add to cache
    }
    return [[object retain] autorelease];
}

Pak volat tuto metodu namísto -init. To umožní, aby -initlogika mnohem čistší.

Také si nejsem jistý, jaké jsou vaše Cachetřída dělá, ale to by stálo za to přehodnotit, že realizace a pomocí skryté statickou proměnnou pro uložení instance (například NSMutableDictionary, kde klíčem je NSNumber vytvořený z indexu). To SO otázka může být užitečný.

Odpovězeno 24/07/2009 v 17:19
zdroj uživatelem

hlasů
1

Souhlasím s Quinnem, že byste měli použít metodu pohodlí třídy. Přesto si myslím, že vaše initmetoda je většinou správná, s výjimkou v elseklauzule je třeba volat nadřazené inicializátor, tzn self = [super init].

Odpovězeno 24/07/2009 v 17:22
zdroj uživatelem

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