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

前端 未结 3 474
醉梦人生
醉梦人生 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

    The crash is caused by the fact that you made the window your application's delegate. When you close the window, that is the last release that kills it off, and if it's the last window you had up, it causes the application to ask its delegate whether it should quit. Since the window you just killed off is the application's delegate, you get that crash.

    Longer explanation and suggestion of solution in my answer on your subsequent question.

    0 讨论(0)
  • 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.

    0 讨论(0)
  • 2021-01-16 21:14

    With ARC you should use strong and weak instead of retain and assign.

    0 讨论(0)
提交回复
热议问题