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

为什么GNUstep NSRunLoop会使用ARC立即退出?,nsrunloop,gnustep,Nsrunloop,Gnustep,我正在尝试GNUstep。如果它运行良好,我将尝试用它创建一个网站。 不管怎样,一开始我就被困住了。GNUstepnsrunlop实现似乎工作不正常 这是我的密码 #import <Foundation/Foundation.h> @interface AAA : NSObject - (void)test1:(id)s; @end @implementation AAA - (void)test1:(id)s { NSLog(@"%@", s); } - (void)d

我正在尝试GNUstep。如果它运行良好,我将尝试用它创建一个网站。 不管怎样,一开始我就被困住了。GNUstep
nsrunlop
实现似乎工作不正常

这是我的密码

#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;
}
在OSX下,程序不会退出,只会继续运行run循环。如果我不使用ARC,它在FreeBSD上的GNUstep下同样有效。如果启用ARC,程序将立即退出。 我不知道为什么只有在启用ARC时才起作用。为什么它会立即退出

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

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 &

这似乎是GSFileHandle类中的错误。fileHandleWithStandardInput返回的单例将自动删除。在非ARC模式下,它在@autoreleasepool作用域的末尾被销毁,但您永远无法到达该点,因此它可以正常工作

在ARC模式下,序列将沿以下几条线变化:

    NSFileHandle *tmp = [NSFileHandle fileHandleWithStandardInput];
    objc_retainAutoreleasedReturnValue(tmp);
    [tmp waitForDataInBackgroundAndNotify];
    objc_release(tmp);
调用
objc_release()
后,对象被释放。当对象被解除分配时,它会将自身作为运行循环源移除。然后,运行循环没有注册任何源,因此退出(否则它将永远不等待任何结果)

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


我已经在GNUstep Base svn r37245中修复了这个问题,感谢您的报告(将来,如果将GNUstep错误报告发布到GNUstep邮件列表,而不是发布到随机的第三方网站,则更容易看到……。

这似乎是GSFileHandle类中的错误。fileHandleWithStandardInput返回的单例将自动删除。在非ARC模式下,它在@autoreleasepool作用域的末尾被销毁,但您永远无法到达该点,因此它可以正常工作

在ARC模式下,序列将沿以下几条线变化:

    NSFileHandle *tmp = [NSFileHandle fileHandleWithStandardInput];
    objc_retainAutoreleasedReturnValue(tmp);
    [tmp waitForDataInBackgroundAndNotify];
    objc_release(tmp);
调用
objc_release()
后,对象被释放。当对象被解除分配时,它会将自身作为运行循环源移除。然后,运行循环没有注册任何源,因此退出(否则它将永远不等待任何结果)

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


我已经在GNUstep Base svn r37245中修复了这个问题,感谢您的报告(将来,如果将GNUstep bug报告发布到GNUstep邮件列表,而不是随机发布到第三方网站,则更容易看到……。

感谢您的修复。我将等待下一个版本。我也把这个发到了邮件列表中,确认是一个bug,但我认为我的邮件目前正在被审核中。谢谢你修复这个问题。我将等待下一个版本。我也把这个发到了邮件列表中,确认是一个bug,但我认为我的邮件目前处于适度状态。