Программа получила сигнал: EXC_BAD_ACCESS.Что с этим делать? - PullRequest
0 голосов
/ 02 марта 2012

Я только недавно начал изучать Objective C / Cocoa, и я знаю, насколько важно управление памятью, и я полагаю, что эта ошибка связана с этим.

У меня очень очень простой экран: два UITextView, одна кнопка, одна UILabel.

Мой заголовочный файл имеет:

@interface PontaiViewController : UIViewController {

UITextField *loginField;
UITextField *passwordField;
UILabel *userID;

}

@property (nonatomic, retain) IBOutlet UITextField *loginField;
@property (nonatomic, retain) IBOutlet UITextField *passwordField;
@property (nonatomic, retain) IBOutlet UILabel *userID;


- (IBAction) btnLoginClicked:(id) sender;

Реализация имеет:

@implementation PontaiViewController
@synthesize loginField;
@synthesize passwordField;
@synthesize userID;
-(IBAction) btnLoginClicked:(id)sender {
NSString *string1 = @"username=";
NSString *string2 = [string1 stringByAppendingString:(loginField.text)];
NSString *string3 = [string2 stringByAppendingString:(@"&password=")];
NSString *post = [string3 stringByAppendingString:(passwordField.text)];
NSLog(@"The post is %@", post);
userID.text=loginField.text;
[string1 release];
[string2 release];
[string3 release];
[post release];

}

и заканчивается

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.loginField=nil;
    self.passwordField=nil;
    self.userID=nil;
}

- (void) dealloc {
    [super dealloc];
    [loginField release];
    [passwordField release];
    [userID release];
}

Когда я запускаю эту демонстрацию и пытаюсь что-то написать в TextView, я получаю эту ошибку.

Что бы это могло быть?

С уважением, Фелипе

Ответы [ 4 ]

3 голосов
/ 02 марта 2012

Кроме того, ваши строки NSS автоматически освобождаются, а затем вы выпускаете их снова (через выпуск). Ознакомьтесь с удобными методами управления памятью.

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

stringByAppendingString возвращает автоматически выпущенный объект, не освобождайте string1, string2, string3 и post.

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

В viewDidUnload вы устанавливаете loginField на nil, затем вы пытаетесь разблокировать его в dealloc. Это не правильно. Вам нужно только выпустить действительные предметы, которые у вас есть.

Кроме того, (как указано в комментарии) необходимо поставить [super dealloc] в конце функции dealloc.

Как отмечают другие, вы также не должны освобождать строки, которые получаете от stringByAppendingString.

Вот несколько основных правил управления памятью в Objective-C под iOS:

https://developer.apple.com/library/ios/#documentation/general/conceptual/devpedia-cocoacore/MemoryManagement.html

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

alloc, allocWithZone :, copy, copyWithZone :, mutableCopy, mutableCopyWithZone

1 голос
/ 02 марта 2012

Вы должны закомментировать следующее

//[string1 release];
//[string2 release];
//[string3 release];
//[post release];

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

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