I spent a lot of time trying hundreds of things, and searching on the internet for my problem, but I didn't find anythig, so I hope you guys will be able to help me :).
So, I have an NSMutableDictionary
that I populate with NSArrays
when I parse an XML document. My problem is, I want to empty it before I release it because it appears to cause leaks !
Best solution, to my eyes, is : [myDict removeObjectsForKeys : [myDict allKeys]]
but the app crashes and I get the following message in the console :
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'
I really can't figure why... any ideas ?
EDIT
Important point I forgot (I guess...), is that the dictionary I'm calling is in my application Delegate, with appDelegate = [[UIApplication sharedApplication] delegate];
. (appDelegate defined in my .h with myAppDelegate class type).
Then, I initialize it like this : appDelegate.myDict = [[NS开发者_运维技巧MutableDictionary alloc] init];
Is it wrong ?
What's weird then, is that when I do :
[appDelegate.myDict release];
NSLog( @"%@", appDelegate.myDict);
I get the dictionary filled...
EDIT 2
I just figured out that all my appDelegate variables are not released when I call [appDelegate.myVariable release]
... Wtf am I doing wrong ? This is driving me crazy ><
When you release a dictionary or array it releases all the elements inside it. If you're getting leaks they're not due to a failure to remove the objects.
Of course, in your case part of your problem appears to be that you don't know where the error is occurring. -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)
indicates that you were executing objectAtIndex
on an (empty) NSArray
, and that doesn't happen (directly) if you do [myDict removeObjectsForKeys : [myDict allKeys]]
on an NSDictionary. So you need to figure out where that error is really coming from.
What about this:
// myDict should be NSMutableDictionary
[myDict removeAllObjects];
This should hep you figure out which key (or keys) are pointing to the misbehaving arrays.
for ( NSString *key in [myDict allKeys]) {
NSLog(@" key - %@", key);
[myDict removeObjectForKey: key];
}
NSLog(@" the problem is not with the dictionary...");
You don't need to empty an NSMutableDictionary
before releasing. Any objects retained by the dictionary will sent a release
message when the dictionary is dealloc
ed.
It sounds as though your arrays are being retained elsewhere, causing the leak. Are you sure you've implemented dealloc
methods correctly for all your objects (view controllers, model objects, etc)?
精彩评论