首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象在引用计数为0时仍然可用。

对象在引用计数为0时仍然可用。
EN

Stack Overflow用户
提问于 2013-12-22 04:01:53
回答 1查看 51关注 0票数 1

对不起,如果这是一个复制的条目,我是新的OC。

我已经关闭了“对象-C自动引用计数”在构建设置。我有两个类GuitarGuitarController

GuitarController.m看起来是这样的:

代码语言:javascript
复制
#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看起来是这样的:

代码语言:javascript
复制
#import "Guitar.h"

@implementation Guitar
-(void) play
{
    NSLog(@"play guitar!!!");
}
@end

最后,main.m代码:

代码语言:javascript
复制
#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之后,我引用了它。有什么线索吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-22 04:21:04

很有可能吉他还没有归还给操作系统。这很正常。真正的内存分配是昂贵的。可可在可能的情况下会避开它们。对于如此小的对象,可可几乎肯定只是把它放在它的私人池中,以便稍后再分配。这意味着您的应用程序在技术上仍然拥有内存,因此访问它是完全合法的,并且不会有异常。有关这方面的更多细节,请参见看看malloc在Mac上的工作原理。

释放后访问内存是未定义的行为。在你这样做之后,你不能“期待”任何事情。计算机可以着火,这在规范中是可以考虑的。该程序也可以继续完美地工作。这也符合规范。该系统使您无法保证您将收到错误。

我希望你们关闭ARC仅仅是为了更多地了解一些底层系统。如果是这样的话,那就好了。但对于任何严肃的节目,你应该打开ARC

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20726137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档