很抱歉,如果这是一个重复的条目,我是OC的新手
我在构建设置中关闭了“Object-C自动引用计数”。我有两个班Guitar
和GuitarController
GuitarController.m
看起来像这样:
#import "GuitarController.h"
@implementation GuitarController
-(void) setGuitar:(Guitar*) newGuitar
{
guitar = newGuitar;
// Yes, i did not retain the guitar object.
// I did it on purpose to test whether something will go wrong
}
-(void) playGuitar
{
[guitar play];
}
@end
和Guitar.m
看起来像这样:
#import "Guitar.h"
@implementation Guitar
-(void) play
{
NSLog(@"play guitar!!!");
}
@end
最后,main.m
代码:
#import <Foundation/Foundation.h>
#import "GuitarController.h"
int main(int argc, const char * argv[])
{
Guitar* guitar = [[Guitar alloc] init];
GuitarController* guitarController = [[GuitarController alloc] init];
[guitarController setGuitar:guitar];
[guitar release];
[guitarController playGuitar]; // Expecting an error here
return 0;
}
上面的代码工作得很好。但这显然是错误的,因为我在引用计数变为0后引用了一个对象。任何线索?谢谢!
答案 0 :(得分:3)
吉他很可能尚未返回操作系统。那很正常。实内存分配很昂贵。 Cocoa尽可能避免它们。对于这样一个小小的对象,Cocoa几乎可以肯定只是将它放在私有池中以便稍后再分配。这意味着您的应用程序仍然在技术上拥有内存,因此访问它是完全合法的,并且您不会得到例外。有关详细信息,请参阅A look at how malloc works on the Mac。
释放内存后访问内存是未定义的行为。在你这样做之后你不能“期待”任何事情。计算机可以着火,这将在规范中考虑。该计划也可以继续完美地运作。这也符合规范。系统不会保证您会收到错误。
我希望您关闭ARC只是为了尝试更多地了解底层系统。如果是这样,那没关系。但对于任何严肃的计划you should turn on ARC。