EXC_BAD_ACCESS в main () - PullRequest
       4

EXC_BAD_ACCESS в main ()

2 голосов
/ 31 марта 2012

Я получил 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];, но я не могу понять их отношения.

  2. Почему остановился на этой позиции - main() - а не где-то еще?

Вопрос новичка:)

1 Ответ

5 голосов
/ 31 марта 2012

arrayWithObject: возвращает объект, которым вы не владеете. Поэтому неправильно отправлять его autorelease.

См. Основные правила управления памятью , в частности:

  • Вы не должны уступать право собственности на объект, которым вы не владеете

и

  • Вам принадлежит любой созданный вами объект

Вы создаете объект, используя метод, имя которого начинается с «alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy).

Также, в качестве более общего замечания, не используйте retainCount. Если вы случайно не выполняете низкоуровневый взлом среды выполнения или чего-то еще, вам это не нужно, и оно не вернет вам ничего полезного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...