首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GNUstep NSRunLoop会立即退出ARC?

为什么GNUstep NSRunLoop会立即退出ARC?
EN

Stack Overflow用户
提问于 2013-10-15 19:47:30
回答 1查看 154关注 0票数 1

我正在尝试GNUstep。如果它运行良好,我将尝试用它建立一个网站。不管怎么说,我一开始就被困住了。GNUstep NSRunLoop实现似乎不能很好地工作。

这是我的密码。

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface  AAA : NSObject
- (void)test1:(id)s;
@end
@implementation AAA
- (void)test1:(id)s
{
    NSLog(@"%@", s);
}
- (void)dealloc
{
    NSLog(@"DEALLOCED!!");
}
@end


int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        AAA*    aaa =   [[AAA alloc] init];
        [[NSNotificationCenter defaultCenter] addObserver:aaa selector:@selector(test1:) name:NSFileHandleDataAvailableNotification object:nil];

        [[NSFileHandle fileHandleWithStandardInput] waitForDataInBackgroundAndNotify];
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}

我用这个命令构建了这段代码。

代码语言:javascript
复制
clang -v
EE_GNUSTEP_OPTS="-MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -D_NONFRAGILE_ABI -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -fgnu-runtime -fconstant-string-class=NSConstantString"
EE_BUILD_OPTS="-I/usr/local/include -L/usr/local/lib -lc -lobjc -lgnustep-base -fblocks -fobjc-arc -fobjc-abi-version=3"
alias OBJCC="clang $EE_GNUSTEP_OPTS $EE_BUILD_OPTS"
OBJCC *.m

在OSX下,程序不会退出,只会继续运行运行循环。如果我不使用ARC,它在GNUstep on FreeBSD上同样有效。如果我启用ARC,程序立即退出。我不知道为什么只有在启用ARC时才能做到这一点。为什么它会立即退出?

下面是我使用的组件版本:

代码语言:javascript
复制
svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/releases/1.7 libobjc2-1.7 &
svn co http://svn.gna.org/svn/gnustep/tools/make/tags/make-2_6_5 make-2_6_5 &
svn co http://svn.gna.org/svn/gnustep/libs/base/tags/base-1_24_5 base-1_24_5 &
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-16 13:15:49

这似乎是GSFileHandle类中的一个bug。fileHandleWithStandardInput返回的单例是自动释放的。在非ARC模式下,它在@autoreleasepool作用域的末尾被销毁,但是您永远不会达到这个程度,所以它工作得很好。

在ARC模式下,序列将沿着以下方向发展:

代码语言:javascript
复制
    NSFileHandle *tmp = [NSFileHandle fileHandleWithStandardInput];
    objc_retainAutoreleasedReturnValue(tmp);
    [tmp waitForDataInBackgroundAndNotify];
    objc_release(tmp);

调用objc_release()之后,对象将被解除分配。当对象被解除分配时,它帮助删除了作为运行循环源的自身。然后,run循环没有注册源,因此退出(否则它将永远等待什么都没有)。

这显示了ARC的一个优点--临时对象不会在自动释放池中花费那么多时间--但在这种情况下,它会发现一个bug。幸运的是,它以一种比没有ARC更容易调试的方式发现了这个错误(如果没有,我们会在很晚的时候看到一个崩溃,当当前的自动释放池范围之外的东西试图访问文件句柄时)。

我在GNUstep Base r37245中修正了这个问题,谢谢您的报告(在将来,如果将GNUstep错误报告发布到GNUstep邮件列表中,而不是随机发送到第三方网站上,则更有可能被看到)。

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

https://stackoverflow.com/questions/19389749

复制
相关文章

相似问题

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