Jas*_*ien 6 crash debugging memory-management objective-c foundation
我的调试器坏了,或者有一些我不理解的基础.
我在一个非常基本的命令行程序中有一些非常基本的代码应该崩溃.但是,它并没有崩溃.
int main (int argc, const char * argv[])
{
NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];
NSLog(@"Length: %d", [string length]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于有效的字符串,log语句打印"Length:5".但是,该字符串应该被该点释放,并且exec_bad_access应该抛出错误.
我已经尝试了附带调试器的代码并且没有附加调试器 - 两者都给出了相同的结果.我也启用(和禁用)NSZombie,这似乎没有任何影响(我最初认为这是问题,因为NSZombie对象永远不会被释放 - 但它仍然不会因NSZombie禁用而崩溃).
我在我的本地.gdbinit文件中设置了断点来打破诸如-[NSException raise]和之类的东西objc_exception_throw.我还在许多方法上设置断点NSZombie以捕获它们.
fb -[NSException raise]
fb -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:]
fb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
#define NSZombies
# this will give you help messages. Set to NO to turn them off.
set env MallocHelp=YES
# might also be set in launch arguments.
set env NSZombieEnabled=YES
set env NSDeallocateZombies=NO
set env MallocCheckHeapEach=100000
set env MallocCheckHeapStart=100000
set env MallocScribble=YES
set env MallocGuardEdges=YES
set env MallocCheckHeapAbort=1
set env CFZombie 5
fb -[_NSZombie init]
fb -[_NSZombie retainCount]
fb -[_NSZombie retain]
fb -[_NSZombie release]
fb -[_NSZombie autorelease]
fb -[_NSZombie methodSignatureForSelector:]
fb -[_NSZombie respondsToSelector:]
fb -[_NSZombie forwardInvocation:]
fb -[_NSZombie class]
fb -[_NSZombie dealloc]
fb szone_error
fb objc_exception_throw
Run Code Online (Sandbox Code Playgroud)
设置了这些断点并启用了NSZombie,我应该得到类似[NSString length]: message sent to deallocated instance 0x100010d39打印到控制台的内容,但我没有看到这一点.我看到NSLog打印长度为5.
我看到与其他类的相似行为,如NSURL和NSNumber.但有些类按预期崩溃,例如NSError和NSObject.
这是否与类集群有关?他们在内存管理方面是否遵循相同的规则?
如果类集群与此问题无关,那么我能看到的唯一其他常见特性是,不会以这种方式崩溃的类都是与Core Foundation对应的免费桥接.这可能与它有关吗?
retain/release是 API 和程序员之间的一个契约,当你遵循规则时,它不会崩溃。合约并不保证如果你不遵守规则,它就会崩溃!
在这种情况下,
[[NSString alloc] initWithString:@"Hello"]
Run Code Online (Sandbox Code Playgroud)
@"Hello"只返回与优化相同的对象。该常量NSString永远不会被释放;作为一种优化,retain并且release(我认为)被忽略。这就是为什么它不会崩溃。
@"Hello"您可以通过比较和的指针值来检查我的猜测string。
| 归档时间: |
|
| 查看次数: |
1684 次 |
| 最近记录: |