NSString格式化,访问不良

时间:2012-11-30 09:08:43

标签: objective-c ios

格式化字符串时,我得到EXC_BAD_ACCESS。

NSString *object = [[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"];
NSString *pin = [[NSUserDefaults standardUserDefaults] stringForKey:[NSString stringWithFormat:@"Pin%i ",object.intValue]];
NSString *msg = [NSString stringWithFormat:@"%@N", pin];

NSString *msg2 = @"0001N";

NSLog(@"Sending %@", msg);

tcpConnection *Obj = [tcpConnection alloc];
[Obj loadUpConnection:msg];

如果我使用msg2一切正常。但是如果我使用msg它会得到exc_bad_access,即使NSLog正确打印了msg。

2 个答案:

答案 0 :(得分:3)

我怀疑您的loadUpConnection:方法未保留其参数。

关于objective-c,你似乎有很多东西要学习。

我担心这会让你感到困惑,但msg2变量指向字符串"0001N"的静态实例(因为你在编译时硬编码它,系统会创建一个静态实例)使用)。这就是使用msg2时不会崩溃的原因,但是当您使用msg时会崩溃。 msg指向动态分配的实例。返回给你的引用是“自动释放”,这意味着它将在未来的某个时刻释放(通常在运行循环迭代结束时)。如果您的loadUpConnection:方法未保留其参数,则在您尝试使用msg字符串之前将释放该EXC_BAD_ACCESS字符串,从而导致msg2错误。因为{{1}}是一个静态实例,所以它永远不会被释放,因此它不会崩溃。

我唯一的建议是继续学习 - 拿起一本书,我推荐Stephen Kochan的'Programming in Objecive-C',或者Aaron Hillegass的'iPhone Programming A Big Nerd Ranch Guide'。

答案 1 :(得分:1)

你必须初始化你* Obj。

tcpConnection *Obj = [tcpConnection alloc] init ...