Какао - Справка по отладке - PullRequest
0 голосов
/ 09 июля 2010

Хорошо, почему-то мой код не будет играть хорошо, и я слишком новичок в какао, чтобы понять это самостоятельно.

когда нажата кнопка отправки, это означает запуск метода createEmail. Но это говорит
GDB: Программа получила сигнал: «EXC_BAD_ACCESS». когда кнопка нажата.

#import "Controller.h"

@implementation Controller
-(IBAction)send:(id)sender{
 [self createEmail];
}

-(void)createEmail{
 NSString *number  = [numfield stringValue]; 
 NSString *carrier = [carrierfield stringValue];
 NSString *carrierTag;

 [carrier lowercaseString]; //make all lowercase 

 //set carrierTag based on what carrier it is
 if ([carrier isEqualToString:@"verizon"]) {
  carrierTag = @"@vtext.com";
 }
 if ([carrier isEqualToString:@"at&t"]) {
  carrierTag = @"@txt.att.net";
 }
 if ([carrier isEqualToString:@"nextel"]) {
  carrierTag = @"@messaging.nextel.com";
 }
 if ([carrier isEqualToString:@"sprint"]) {
  carrierTag = @"@messaging.sprintpcs.com";
 }
 if ([carrier isEqualToString:@"cingular"]) {
  carrierTag = @"@cingularme.com";
 }
 if ([carrier isEqualToString:@"cingular"]) {
  carrierTag = @"@cingularme.com";
 }
 if ([carrier isEqualToString:@"virgin"]) {
  carrierTag = @"@vmobl.com";
 }
 if ([carrier isEqualToString:@"t-mobile"]) {
  carrierTag = @"@tmomail.net";
 }

 //Concatenate number and carrierTag to create an email address
 email = [number stringByAppendingString:carrierTag];
}
@end

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Ну, я вижу две возможности.Либо carrier задан неправильно, либо он не равен ни одной из этих строк, в этом случае carrierTag остается неинициализированным.

В первом случае исключение, вероятно, находится в строке:

[carrier lowercaseString]

В последнем случае это, вероятно, будет по адресу:

email = [number stringByAppendingString:carrierTag];

Отладчик должен предоставить вам эту информацию, и вы также должны предоставить ее нам: -)

Кроме того, lowercaseString возвращает другую строку, она не работает на месте, поэтому вам необходимо:

carrier = [carrier lowercaseString];

То, что вы можете захотетьdo устанавливает carrierTag в исходно пустую строку, чтобы ничего не добавлялось, если совпадений нет:

carrierTag = @"";
if ([carrier isEqualToString:@"verizon"]) {
    carrierTag = @"@vtext.com";
}
:
:
0 голосов
/ 09 июля 2010

В дополнение к проблемам, указанным в других ответах, email представляется переменной-членом, и вы присваиваете ей автоматически высвобождаемое значение, то есть оно станет мусором, как только цикл событий завершится, и выпочти наверняка вылетит в следующий раз, когда вы получите к нему доступ.Вам нужно сохранить это значение при его назначении.

Если вы новичок в Какао, вам обязательно следует прочитать Введение Apple в управление памятью .

0 голосов
/ 09 июля 2010

Если carrier не является ни одной из обработанных строк, carrierTag остается неинициализированным - вы должны по крайней мере установить его на nil и проверить это перед работой с ним:

NSString *carrierTag = nil;
// ...
if (carrierTag) { 
    // ...

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

carrier = [carrier lowercaseString];

Обратите внимание, что вы могли бы значительно упростить поиск тегов-носителей, используя словарь, например:

NSDictionary *carrierTags = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"@vtext.com", @"verizon",
                               // ...
                               nil];
NSString *carrierTag = [carrierTags objectForKey:carrier ? carrier : @""];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...