我的控制台中有一条EXC_BAD_ACCESS消息。我在this site上读到了环境变量NSZombieEnabled和MallocStackLoggingNoCompact。我创建了我的环境变量: NSZombieEnabled = YES 和 MallocStackLoggingNoCompact = 1 。在控制台中,我看到了
2010-03-01 19:13:46.924 CruzNomad [7952:207] *** - [CFString stringByAddingPercentEscapesUsingEncoding:]: 消息发送到解除分配的实例 0x58448e0
然后在(gdb)提示符下,我做了 info malloc-history 0x58448e0 ,这给了我:
Alloc: Block address: 0x058448e0 length: 64
Stack - pthread: 0xa0b33500 number of frames: 25
0: 0x98e089bc in malloc_zone_malloc
1: 0x21516aa in _CFRuntimeCreateInstance
2: 0x2152bf8 in __CFStringCreateImmutableFunnel3
3: 0x21567d9 in CFStringCreateCopy
4: 0x21742fc in _CFStringCreateWithFormatAndArgumentsAux
5: 0xdb546 in -[NSPlaceholderString initWithFormat:locale:arguments:]
6: 0xdb4d8 in +[NSString stringWithFormat:]
7: 0x23aa3 in -[BuisnessCardViewController viewDidLoad] at /Users/.../Classes/BuisnessCardViewController.m:85
8: 0x3d6796 in -[UIViewController view]
9: 0x347b4 in -[gm_menuViewController btn5_Pressed:] at /Users/.../Classes/menuViewController.m:535
10: 0x357459 in -[UIApplication sendAction:to:from:forEvent:]
11: 0x3baba2 in -[UIControl sendAction:to:forEvent:]
12: 0x3bcdc3 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
13: 0x3bbb0f in -[UIControl touchesEnded:withEvent:]
14: 0x370e33 in -[UIWindow _sendTouchesForEvent:]
15: 0x35a81c in -[UIApplication sendEvent:]
16: 0x3610b5 in _UIApplicationHandleEvent
17: 0x2984ed1 in PurpleEventCallback
18: 0x2197b80 in CFRunLoopRunSpecific
19: 0x2196c48 in CFRunLoopRunInMode
20: 0x298378d in GSEventRunModal
21: 0x2983852 in GSEventRun
22: 0x362003 in UIApplicationMain
23: 0x2c8c in main at /Users/.../source/main.m:14
24: 0x2bfa in start
第7行说问题出现在BuisnessCardViewController.m的第85行。那条线在这里:
fullAddress = [NSString stringWithFormat:@"%@ %@", fullAddress, myString];
我正在附加 fullAddress 和 myString 的内容,并将其存储回 fullAddress 。
如果我正确地解释了这一点,那么在此行之后, fullAddress 会被取消分配。当我删除断点并将鼠标悬停在变量上时,其值显示“超出范围。”
fullAddress 稍后会在此方法中使用。我使用它发送给Google,以便在同一方法的第164行中进行反向地理编码。
NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [fullAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
即使在这里,也说“超出范围”。我很难过......有什么建议吗?
谢谢!
托马斯
答案 0 :(得分:3)
在大多数情况下,当您没有保留属于对象的属性并在其他方法中向其发送延迟消息时,会发生这种情况。
因此,在初始化某些字符串的地方尝试:
[fullAddress retain];
或
[myString retain];
取决于哪一个在其他方法中初始化。
答案 1 :(得分:1)
您是否尝试使用格式附加字符串?
fullAddress = [NSString stringWithFormat:@"%@ %@", fullAddress, myString];
使用:
- (NSString *)stringByAppendingFormat:(NSString *)format ...
像这样:
[fullAddress stringByAppendingFormat:@" %@", myString];