对不起,如果这是一个复制的条目,我是新的OC。
我已经关闭了“对象-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];
}
@endGuitar.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之后,我引用了它。有什么线索吗?谢谢!
发布于 2013-12-22 04:21:04
很有可能吉他还没有归还给操作系统。这很正常。真正的内存分配是昂贵的。可可在可能的情况下会避开它们。对于如此小的对象,可可几乎肯定只是把它放在它的私人池中,以便稍后再分配。这意味着您的应用程序在技术上仍然拥有内存,因此访问它是完全合法的,并且不会有异常。有关这方面的更多细节,请参见看看malloc在Mac上的工作原理。。
释放后访问内存是未定义的行为。在你这样做之后,你不能“期待”任何事情。计算机可以着火,这在规范中是可以考虑的。该程序也可以继续完美地工作。这也符合规范。该系统使您无法保证您将收到错误。
我希望你们关闭ARC仅仅是为了更多地了解一些底层系统。如果是这样的话,那就好了。但对于任何严肃的节目,你应该打开ARC。
https://stackoverflow.com/questions/20726137
复制相似问题