main()中的EXC_BAD_ACCESS

时间:2012-03-31 11:15:19

标签: objective-c ios cocoa

我在EXC_BAD_ACCESS中收到main(),这是我的代码:

int main(int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"TestBedAppDelegate");
    [pool release];
    return retVal;
}

@interface TestBedAppDelegate : NSObject <UIApplicationDelegate>
@end

@implementation TestBedAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[[TestBedViewController alloc] init]];
    [window addSubview:nav.view];
    [window makeKeyAndVisible];
}
@end

- (void) action: (id) sender
{
    [self highRetainCount];
}

@implementation TestBedViewController
- (void) highRetainCount
{
    UIView *view = [[[UIView alloc] init] autorelease];
    printf("Count: %d\n", [view retainCount]);

    NSArray *array1 = [NSArray arrayWithObject:view];
    printf("Count: %d\n", [view retainCount]);
    [array1 autorelease]; // If comment this line, everything will be OK
}
@end

程序停在main()

int retVal = UIApplicationMain(argc, argv, nil, @"TestBedAppDelegate");

正如评论所说,在评论[array1 autorelease];后,一切正常。

所以这是我的问题:

  1. EXC_BAD_ACCESS经常表示使用已发布的对象。显然,[array1 autorelease];main()有关,但我无法理解他们之间的关系。

  2. 为什么停在这个位置 - {{1}} - 而不是其他地方?

  3. 新手问题:)

1 个答案:

答案 0 :(得分:5)

arrayWithObject:返回您不拥有的对象。因此,您随后发送autorelease是错误的。

请参阅Basic Memory Management Rules,具体来说:

  
      
  • 您不得放弃您不拥有的对象的所有权
  •   

  
      
  • 您拥有自己创建的任何对象
  •   
     

使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象(例如,allocnewObject或{{1 }})。

另外,作为更一般的观点,请勿使用mutableCopy。除非您碰巧正在对运行时或其他东西进行低级别的黑客攻击,否则您不需要它,并且它不会向您返回任何有用的东西。