EXC_BAD_ACCESS when I close my window, which is also my application's delegate

前端 未结 3 479
醉梦人生
醉梦人生 2021-01-16 20:48

I wrote a Cocoa Application and I got EXC_BAD_ACCESS error when I\'m closing an application window. I read that this error usually means problems with memory, b

3条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-16 21:05

    This is wrong:

    dataset = [[NSMutableArray alloc] init]; // WRONG
    dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
    

    Why? You first allocate an empty array, and store that in the instance variable dataset. But in the next line, you replace the empty array with whatever +unarchiveObjectWithFile: returns. Why is this a problem? Well, if you read the docs, you'll see that it returns nil if the file is not found. This means that you now replace the empty array with nil, and all messages you send to dataset will be ignored (messages to nil are silently ignored in Objective-C)

    I assume you actually want load the dataset from file, and only if that failed, start with an empty dataset:

    dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
    if (dataset==nil) dataset = [[NSMutableArray alloc] init];
    

    You have a similar error later on:

    Dream *dr = [[Dream alloc] init]; // WRONG
    dr = [dataset objectAtIndex:index];
    

    You create a Dream object, and then replace it immediately with something from the dataset. What you actually want to do is:

    Dream *dr;
    dr = [dataset objectAtIndex:index];
    

    or shorter:

    Dream *dr = [dataset objectAtIndex:index];
    

    Then again, you could replace the while loop with a fast-enumeration-style for loop:

        for (Dream *dr in dataset) {
            [dreamlist addObject: dr.dreamname];         
        }
    

    Finally, to get to a point, I don't think the EXC_BAD_ACCESS actually occurs in main.h. I assume you use Xcode 4. Please use the thread/stack navigator in the right sidebar when debugging to find the actual position where the error occurs.

    It could be that the error actually occurs in applicationWillTerminate:, because you try to archive dataset, which is probably nil, and it's probably not allowed to archive nil.

提交回复
热议问题