iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   touchesBegan EXC_BAD_ACCESS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/40180-touchesbegan-exc_bad_access.html)

Rockafello 22-07-09 12:12

touchesBegan EXC_BAD_ACCESS
 
Heren,

Ik zit met een klein "bugje" en heb even geen idee hoe ik het kan oplossen.

In de volgende code:

Code:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchposition = [touch locationInView:self.view];
    for (UIImageView *mView in imageArray) {
        CGRect rect = [mView frame];
    }
}

Dit gaat een aantal keren goed 2x. vervolgen krijg ik een EXC_BAD_ACCESS error op de CGRect rect = [mView frame].... en ik weet dus niet waarom
imageArray is een NSMutableArray en init met retain.

Iemand een idee waar dit aan kan liggen? Ik weet ook niet precies hoe ik meer informatie uit me debugger kan krijgen.

Matisse 22-07-09 12:41

Je hebt die mView al eens ergens een release message gestuurd waardoor mView nu naar een ongeldige geheugenplaats wijst.

Deze code is wat je in essentie doet:
Code:

UIImageView *imgView = [[UIImageView alloc] init];
[imgView release];
CGRect rect = [imgView frame];      // Oeps... EXC_BAD_ACCESS


Matisse 22-07-09 12:45

Citaat:

Oorspronkelijk geplaatst door Rockafello (Bericht 327904)
imageArray is een NSMutableArray en init met retain.

init met retain... klinkt vreemd...

Rockafello 22-07-09 12:54

Code:

NSMutableArray *imageArrey = [[[NSMutableArray alloc] init] retain];
retain schijnt ervoor te zijn, dat de array ook buiten een functie beschikbaar is...??


Ahh fout zat heel ergens anders.....had wel te maken met de ImageView en die release ik...oops.

ff naar de markt en loempia halen helpt vaak met dit soort problemen. ff weglopen van je probleem.

Als .NET/java progger heb je niet zoveel te doen met pointers :)

Matisse 22-07-09 13:15

Citaat:

Oorspronkelijk geplaatst door Rockafello (Bericht 327934)
Code:

NSMutableArray *imageArrey = [[[NSMutableArray alloc] init] retain];
retain schijnt ervoor te zijn, dat de array ook buiten een functie beschikbaar is...??

Je kan het beter als volgt doen, voor zover dit overeenkomt met wat je wil doen uiteraard,...
Code:

- (NSMutableArray *)doeIetsEnGeefArrayTerug1 {
        // Eerste mogelijkheid
        NSMutableArray *array = [[NSMutableArray alloc] init];
        // doe iets
        return [array autorelease];
}

- (NSMutableArray *)doeIetsEnGeefArrayTerug2 {
        // Tweede mogelijkheid
        NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
        // doe iets
        return array;
}

- (void)eenAndereMethode {
        NSMutableArray *array = [[self doeIetsEnGeefArrayTerug1] retain];
        //blablabla
        [array release];
}

Dankzij de autorelease heeft eenAndereMethode tijd om de reference count te verhogen, terwijl doeIetsEnGeefArrayTerug mooi het eigen gealloceerde geheugen opkuist (lees: reference count verlagen).
De methodes 1 en 2 zijn als ik me niet vergis gelijkwaardig.

Edit:
was vergeten een release te doen in eenAndereMethode en een init in doeIetsEnGeefArrayTerug2 :)

Waarom dit beter is: in jouw implementatie ga je er van uit dat er zeker en vast nog ergens een functie is die een release op die imageArray doet. In mijn oplossing maakt het niet uit of die eenAndereMethode bestaat of niet, het geheugen is steeds mooi opgekuist.

Rockafello 22-07-09 13:38

Duidelijk verhaal! Thnx voor de hulp zover

Voor mijn oplossing werkt mijn versie ook, aangezien ik in het array een spelboard bewaar van een vast aantal ImageViews. in de dealloc release ik hem weer.

Het is ff doorbijten, maar begin het nu leuk te vinden te proggen voor iPhone!! Als dit projectje af is, maar eens verdiepen in Core Animations.


Alle tijden zijn GMT +2. Het is nu 07:12.