Objective c Cocoa-调试帮助

Objective c Cocoa-调试帮助,objective-c,cocoa,debugging,Objective C,Cocoa,Debugging,好吧,由于某些原因,我的代码不会很好地运行,而且我对cocoa来说太新了,无法独自解决这个问题 当按下send按钮时,意味着运行createEmail方法。但是上面写着 GDB:程序接收到信号:“EXC\U坏访问”。当按下按钮时 #import "Controller.h" @implementation Controller -(IBAction)send:(id)sender{ [self createEmail]; } -(void)createEmail{ NSString *n

好吧,由于某些原因,我的代码不会很好地运行,而且我对cocoa来说太新了,无法独自解决这个问题

当按下send按钮时,意味着运行createEmail方法。但是上面写着
GDB:程序接收到信号:“EXC\U坏访问”。当按下按钮时

#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

如果
carrier
不是处理过的字符串,则未初始化
carrierTag
——您至少应将其设置为
nil
,并在使用它之前进行测试:

NSString *carrierTag = nil;
// ...
if (carrierTag) { 
    // ...
还有一个问题是,您希望
小写字符串
对字符串进行变异,但它只返回一个新字符串,即调用它的字符串的小写版本。例如,使用以下替代方法:

carrier = [carrier lowercaseString];
请注意,通过使用字典,您可以大大简化承运人标签的查找,例如:

NSDictionary *carrierTags = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"@vtext.com", @"verizon",
                               // ...
                               nil];
NSString *carrierTag = [carrierTags objectForKey:carrier ? carrier : @""];

嗯,我认为有两种可能性。
carrier
未正确设置,或者它不等于这些字符串中的任何一个,在这种情况下,
carrierTag
未初始化

在前一种情况下,例外情况可能是:

[carrier lowercaseString]
在后者中,它可能位于:

email = [number stringByAppendingString:carrierTag];
调试器应该向您提供这些信息,您也应该向我们提供这些信息:-)

此外,返回另一个字符串,它不能在适当的位置操作,因此您需要:

carrier = [carrier lowercaseString];
您可能需要将
carrierTag
设置为初始空字符串,以便在不匹配时不追加任何内容:

carrierTag = @"";
if ([carrier isEqualToString:@"verizon"]) {
    carrierTag = @"@vtext.com";
}
:
:

除了在其他答案中指出的问题外,
email
似乎是一个成员变量,您正在为它分配一个自动删除的值——这意味着一旦事件循环完成,它就会变成垃圾,下次访问它时几乎肯定会崩溃。赋值时需要保留该值


如果你是Cocoa新手,你绝对应该阅读。

hmm这很有趣……如果我输入“Verizon”(注意大写字母V),它会返回错误。如果我输入“verizon”,什么都不会发生。。。但是我的程序没有做任何事情,这意味着我很好?大写字母V是问题所在吗?好的,我添加了[bodyfield setStringValue:email];看看是否会打印出正确的东西,number@vtext.com所以它起作用了。我会把它标记为已解决,这样就不会有其他人在这里发帖了。thanks@sho:标准字符串比较区分大小写,
小写
返回新字符串@pax:将消息发送到
nil
不会导致错误的访问。值得一提的是,虽然初始化为nil肯定是一个好的第一步,但将nil传递给大多数AppKit方法也不是一个好主意,因此也应该避免使用nil参数调用stringByAppendingString:。@smo:当然,我并不是有意暗示这一点。