在过去,我的代码发生了运行时错误,我正在尝试检查对象是否存在,并且我收到的消息是“EXC_BAD_ACCESS试图访问释放的对象”。那么 - 假设我有一个类,它暴露一个指向内部布尔变量的指针,该对象的生命周期为YES,并在对象解除分配时切换为No:
@implementation TestClass
- (id) init {
//instance variables.
amIAlive = YES;
alivePointer = &amIAlive;
return self;
}
- (BOOL *)getSignal {
return alivePointer;
}
- (void) dealloc {
NSLog(@"Test Object is deallocing");
amIAlive = NO;
[super dealloc];
}
@end
现在,使用这个课我试试。
TestObject *obj = [[TestObject alloc] init];
BOOL *signal = [obj getSignal];
if(*signal) {
NSLog(@"Test Object is still alive");
}
[obj release];
if(!*signal) {
NSLog(@"Test Object has been dealloced");
}
Voila,它按预期工作。现在,这就是事情。我并不天真地认为“amIAlive”占用的地址在对象解除分配后的某个时刻不会被重新分配给其他对象。但是,我仍然使用TestObject实例之外的“* signal”指向该地址。当地址被重新分配时,“* signal”将产生不可预测的结果。我可以依赖地址多久amIAlive?有没有办法“锁定”地址,以便我可以一直依赖它?谢谢你的时间!
答案 0 :(得分:1)
“锁定”该地址意味着它将永远不会再被malloc / alloc返回。
这无异于说它指向的任何最小存储单元现在都无法访问。
如果这就是你想要的,那么为什么要首先解除分配呢?你的问题意味着你想要“内存泄漏”,即:即使已经解除分配,它仍然保持活力。
未经考验的想法#1:在你的dealloc之后立即尝试“malloc(1)”。可能的情况是,你可以幸运,并让malloc抓住刚刚释放我的dealloc的内存。
未经考虑的想法#2:在TestClass
中有一个字段指向你想要在dealloc中存活的任何字段,并且在dealloc期间,将该字段的“所有权”转移到其他目的的对象上监控/跟踪您的“泄漏:”
但是关于为什么你想要这样做的解释(除了调试目的)可能会有很长的路要走,开始考虑一个真正的解决方案,一开始不会看起来像个问题?
答案 1 :(得分:0)
释放对象后,对象将无法再回复该消息。没了。现在,内存可以由完全不同的对象使用。
第二个示例有效,因为您已经将指针传递给init,指针指向的内存仍然为该BOOL分配。
答案 2 :(得分:0)
将WeakReference添加到该对象到全局数组。
答案 3 :(得分:0)
您的代码存在一些问题。
在你的初学者中你回归自我,但自我还没有存在。你需要:
-(id)init {
self = [super init];
if (self) {
// do your init stuff
}
return self;
}
当dealloc'ed时,无法再访问你的对象了。
你是如何宣布iAmAlive变量的?为什么使用指针而不是直接访问它?我建议你阅读Memory Management。