Objective-C: Rögzítés memóriakezelés eljárásában

szavazat
5

Már majdnem ott megértése egyszerű hivatkozás számláló / memória kezelése Objective-C, de én a nehéz időben az alábbi kódot. Én felszabadító mutableDict (kommentálta az alábbi kódot), és ez okozza káros viselkedést kódomat. Ha hagyja, hogy a memóriavesztés, úgy működik, mint az várható volt, de ez nyilvánvalóan nem a választ itt. ;-) lenne valakinek tapasztaltabb emberek olyan kedves, hogy nekem pont a helyes irányba, hogy hogyan tudok újra írni bármelyik ezt a módszert, hogy jobban kezelni a memóriát? Főleg milyen vagyok irányító NSMutableDictionary * mutableDict, mivel ez a nagy bűnös itt. Szeretném megérteni a problémát, és nem csak a másolás / beillesztés kódot - így néhány megjegyzést / feedback ideális. Mindenkinek köszönöm.

- (NSArray *)createArrayWithDictionaries:(NSString *)xmlDocument 
                               withXPath:(NSString *)XPathStr {

    NSError *theError = nil;
    NSMutableArray *mutableArray = [[[NSMutableArray alloc] init] autorelease];
    //NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
    CXMLDocument *theXMLDocument = [[[CXMLDocument alloc] initWithXMLString:xmlDocument options:0 error:&theError] retain]; 
    NSArray *nodes = [theXMLDocument nodesForXPath:XPathStr error:&theError];
    int i, j, cnt = [nodes count];
    for(i=0; i < cnt; i++) {
        CXMLElement *xmlElement = [nodes objectAtIndex:i];
        if(nil != xmlElement) {
            NSArray *attributes = [NSArray array];
            attributes = [xmlElement attributes];
            int attrCnt = [attributes count];
            NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
            for(j = 0; j < attrCnt; j++) {
                if([[[attributes objectAtIndex:j] name] isKindOfClass:[NSString class]]) 
                    [mutableDict setValue:[[attributes objectAtIndex:j] stringValue] forKey:[[attributes objectAtIndex:j] name]];
                else 
                    continue;
            }
            if(nil != mutableDict) {
                [mutableArray addObject:mutableDict];
            }
            [mutableDict release];  // This is causing bad things to happen.
        }
    }

    return (NSArray *)mutableArray;
}
A kérdést 26/02/2009 23:32
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
5

Itt egyenértékű átírni a kódot:

- (NSArray *)attributeDictionaries:(NSString *)xmlDocument withXPath:(NSString *)XPathStr {
    NSError *theError = nil;
    NSMutableArray *dictionaries = [NSMutableArray array];
    CXMLDocument *theXMLDocument = [[CXMLDocument alloc] initWithXMLString:xmlDocument options:0 error:&theError]; 
    NSArray *nodes = [theXMLDocument nodesForXPath:XPathStr error:&theError];

    for (CXMLElement *xmlElement in nodes) {
        NSArray *attributes = [xmlElement attributes];
        NSMutableDictionary *attributeDictionary = [NSMutableDictionary dictionary];
        for (CXMLNode *attribute in attributes) {
            [attributeDictionary setObject:[attribute stringValue] forKey:[attribute name]];
        }

        [dictionaries addObject:attributeDictionary];
    }

    [theXMLDocument release];
    return attributeDictionaries;
}

Figyeljük Csak azért tettem referencia számít theXMLDocument. Ennek oka, hogy a tömböket, szótárakat élni túlmutat ezt a módszert. A arrayés dictionaryosztály módszerek létrehozása autoreleased példányait NSArrayés NSMutableDictionarytárgyakat. Ha a hívó fél nem kifejezetten megtartják őket, akkor azok automatikusan megjelent a következő go-round az alkalmazás esemény hurok.

  • Azt is eltávolították kódot, amelyet soha nem fog végrehajtani. A CXMLNode namemódszer azt mondja, hogy visszaadja a húr, így a teszt mindig igaz.
  • Ha mutableDictvan nil, akkor nagyobb problémákat. Még mindig jobb, hogy kivételt dob, mint csendben nem, én így is tettem el, hogy a vizsgálatban is.
  • Azt is használják a viszonylag új forfelsorolás szintaxist, amely megszünteti a számláló változó.
  • I átnevezték változók és a módszer, hogy egy kicsit több, Kakaó-szerű. Kakaó eltér a legtöbb nyelven, hogy ez általában nem megfelelő, hogy egy ige, mint a „létrehozni”, hacsak nem az a célunk, hogy a hívó fél felszabadításáért felelős bármilyen tárgy visszatér.
  • Te nem csináltál semmit theError. Akkor vagy ellenőrizze, és jelentse a hibát, vagy pedig át a nilha nem megy, hogy ellenőrizze azt. Nincs értelme, hogy a app építeni egy hibaobjektum akkor nem fog használni.

Remélem, ez segít neked mutatott a helyes irányba.

Válaszolt 27/02/2009 00:18
a forrás felhasználó

szavazat
1

Nos, felszabadító mutableDict tényleg nem okoz semmilyen problémát, mivel a vonal fölé (hozzátéve, hogy mutableDict mutableArray) megtartja automatikusan. Bár nem vagyok benne biztos, hogy pontosan mi baj van a kód (ha nem adja meg, milyen „rossz dolgok” jelenti), van néhány általános dolog azt javaslom:

  1. Ne autorelease mutableArray azonnal. Legyen rendszeres alloc- / init nyilatkozatot, és az automata azt, amikor vissza ( „visszatérés [mutableArray autorelease]”).

  2. theXMLDocument szivárog, biztos, hogy engedje, hogy mielőtt visszatért. Is, akkor nem kell megtartani úgy, mint te. alloc / init ez a munka megkezdése révén tárgy megtartása száma 1, megtartva ismét csak biztosítja szivárog örökre. Megszabadulni a megtartása, és engedje meg, mielőtt visszatért, és nem fog szivárogni.

  3. Csak egy tipp: biztos, hogy megtartják a visszatérési érték módszert, ha a máshol - az eredmény már autoreleased a nem garantált lenni, amikor szükség van rá, ha kifejezetten megtartják / engedje el valahol.

Egyébként ezt a kódot kell dolgozni. Ha ez még mindig nem, egy másik dolog, amit megpróbál talán csinál [mutableArray addObject: [mutableDict másolja]] annak érdekében, hogy mutableDict okozza, nem jelent problémát, ha elengedi.

Válaszolt 26/02/2009 23:49
a forrás felhasználó

szavazat
0

A Memory Management programozási útmutató alapján a témát Visszatérve Tárgyak Methods (görgess le egy kicsit), van néhány egyszerű példát, hogy hogyan, hogy visszatérjen tárgyakat egy módszert a megfelelő memória gazdálkodás.

Válaszolt 08/09/2010 22:48
a forrás felhasználó

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