Отправка релиза после [[NSString alloc] init] вызывает EXIT_BAD_ACCESS - PullRequest
0 голосов
/ 02 декабря 2010

Я думаю, что есть кое-что, чего я не понимал в управлении памятью в xcode и когда нужно или нет освобождать объекты, чтобы избежать утечек памяти.Я читал эту презентацию, но так как нет звука, я не понимаю все стороны: http://www.slideshare.net/OwenGoss/finding-and-fixing-memory-leaks-in-ios-apps-5251292

Вот очень простой код моего приложения, который является проблемой:

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

 NSString *myBundleName = [[NSString alloc] init];
 NSString *myBundleVersion = [[NSString alloc] init];
 NSString *myBundleBuild = [[NSString alloc] init];
 NSString *myIosName = [[NSString alloc] init];
 NSString *myIosVersion = [[NSString alloc] init];

 myBundleName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
 myBundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
 myBundleBuild = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
 myIosName = [[UIDevice currentDevice] systemName ];
 myIosVersion = [[UIDevice currentDevice] systemVersion];

 self.versionBuildLabel.text = [NSString stringWithFormat:@"%@ version %@ build %@ on %@ %@", myBundleName, myBundleVersion, myBundleBuild, myIosName, myIosVersion];

 [myBundleName release];
 [myBundleVersion release];
 [myBundleBuild release];
 [myIosName release];
 [myIosVersion release];

}

Если я попытаюсь запустить это

 [myBundleName release];
 [myBundleVersion release];
 [myBundleBuild release];
 [myIosName release];
 [myIosVersion release];

Затем приложение завершится с

[Session started at 2010-12-02 14:08:47 +0700.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1472) (Wed Jul 21 10:53:12 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".
sharedlibrary apply-load-rules all
Attaching to process 26707.
Pending breakpoint 1 - ""HomeVC.m":49" resolved
(gdb) continue
Current language:  auto; currently objective-c
[Switching to process 26707]
[Switching to process 26707]
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) 

Я подумал, что поступил правильно, выпустив промежуточные переменные, используемые для облегчения кодапонять.

В чем здесь проблема?

Примечание: я сталкиваюсь с подобными проблемами в другой части моего кода, но это самый простой пример, который вызывает у меня проблемы, для которых, вероятно, естьПонятие я не понял.

1 Ответ

4 голосов
/ 02 декабря 2010

Когда вы присваиваете переменные с элементами из [UIDevice currentDevice] и [NSBundle mainBundle], эти объекты автоматически освобождаются. Поскольку они автоматически выпущены, iOS автоматически обрабатывает управление этими объектами для вас. Вот почему ваше приложение падает, когда вы пытаетесь вручную release их.

Не инициализируйте ваши NSString s для новых объектов (т.е. [[NSString alloc] init]). Инициализируйте их с помощью удобных методов сразу:

NSString *myBundleName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *myBundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
NSString *myBundleBuild = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
NSString *myIosName = [[UIDevice currentDevice] systemName];
NSString *myIosVersion = [[UIDevice currentDevice] systemVersion];

И не звоните release ни по одному из них. Таким образом, ваш метод никогда не будет владеть этими объектами; они просто передаются ему для использования.

...