我正在尝试GNUstep。如果它运行良好,我将尝试用它建立一个网站。不管怎么说,我一开始就被困住了。GNUstep NSRunLoop实现似乎不能很好地工作。
这是我的密码。
#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;
}我用这个命令构建了这段代码。
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时才能做到这一点。为什么它会立即退出?
下面是我使用的组件版本:
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 &发布于 2013-10-16 13:15:49
这似乎是GSFileHandle类中的一个bug。fileHandleWithStandardInput返回的单例是自动释放的。在非ARC模式下,它在@autoreleasepool作用域的末尾被销毁,但是您永远不会达到这个程度,所以它工作得很好。
在ARC模式下,序列将沿着以下方向发展:
NSFileHandle *tmp = [NSFileHandle fileHandleWithStandardInput];
objc_retainAutoreleasedReturnValue(tmp);
[tmp waitForDataInBackgroundAndNotify];
objc_release(tmp);调用objc_release()之后,对象将被解除分配。当对象被解除分配时,它帮助删除了作为运行循环源的自身。然后,run循环没有注册源,因此退出(否则它将永远等待什么都没有)。
这显示了ARC的一个优点--临时对象不会在自动释放池中花费那么多时间--但在这种情况下,它会发现一个bug。幸运的是,它以一种比没有ARC更容易调试的方式发现了这个错误(如果没有,我们会在很晚的时候看到一个崩溃,当当前的自动释放池范围之外的东西试图访问文件句柄时)。
我在GNUstep Base r37245中修正了这个问题,谢谢您的报告(在将来,如果将GNUstep错误报告发布到GNUstep邮件列表中,而不是随机发送到第三方网站上,则更有可能被看到)。
https://stackoverflow.com/questions/19389749
复制相似问题