iphone - Why is my Objective-C object being deallocated? -
iphone - Why is my Objective-C object being deallocated? -
i have problem objective-c object (in ios game app) beingness mysteriously deallocated.
the object gamecharacter instance instantiated so:
for (int c = 0; c < knrofguards; c++) { gamecharacter* guard = [[gamecharacter alloc] initguard:self sprite:guardsprite]; [characterarray addobject:guard]; [guard release]; } i have convenience method finding gamecharacter:
- (gamecharacter*)findcharacterwithindex:(int)index { homecoming [characterarray objectatindex:index]; } and code generates error looks like:
for (int c = 0; c < [self charactercount]; c++) { gamecharacter* tempcharacter = [self findcharacterwithindex:c]; if (tempcharacter.playerid == playerindex]) { ... } } running code for time (never immediately) generates error in console:
[gamecharacter playerid]: message sent deallocated instance 0x4e47560
with nszombieenabled trick i've managed track downwards object(s) causing problem, still can't understand why object beingness deallocated. searching code "release"/"dealloc" not produce clues.
i've tried removing "release" (and adding "retain"!) alloc/init loop (see top), seems extend time app can run not remove problem entirely.
any hints much appreciated!
edit
thanks quixoto, olie, eiko, tc., i've figured out gamecharacter object beingness deallocated, still don't understand quite why. here trace log in reverse chronological order:
#0 -[gamecharacter dealloc] #1 objc_setproperty #2 -[tiledgroundlayer setselectedcharacter:] #3 -[tiledgroundlayer selectnextcharacterforplayer:searchstep:] #4 -[gamescene selectnextcharacter:] #5 -[gamescene endturn] #6 -[hudlayer onclickdone:] what happens here, user clicks "done", selected character on screen changed , property selectedcharacter on tiledgroundlayer (step #2-4). since selectedcharacter owns previous gamecharacter object, seems beingness deallocated. why not beingness retained nsmutablearray ([characterarray addobject:guard];)?
based on update:
#0 -[gamecharacter dealloc] #1 objc_setproperty #2 -[tiledgroundlayer setselectedcharacter:] i guess you're releasing existing reference object in setter, followed retaining new copy. however, if new object happens exact same object existing reference, might sending retain message deallocated object.
-(void) setselectedcharacter: (gamecharacter*) newcharacter { [character release]; // oops if character == newcharacter character = [newcharacter retain]; } iphone objective-c memory
Comments
Post a Comment