我正在尝试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,它在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 &
答案 0 :(得分:1)
这似乎是GSFileHandle类中的错误。 fileHandleWithStandardInput返回的单例是自动释放的。在非ARC模式下,它会在@autoreleasepool范围的末尾被销毁,但是你永远不会达到这一点,所以它工作正常。
在ARC模式下,序列成为以下几行:
NSFileHandle *tmp = [NSFileHandle fileHandleWithStandardInput];
objc_retainAutoreleasedReturnValue(tmp);
[tmp waitForDataInBackgroundAndNotify];
objc_release(tmp);
调用objc_release()
后,对象将被释放。当对象被释放时,它有助于将自身移除为运行循环源。然后运行循环没有注册的源,因此退出(否则它将永远等待什么)。
这显示了ARC的一个优点 - 临时对象不会在自动释放池中花费太多时间 - 但在这种情况下它会发现一个错误。幸运的是,它以比没有ARC更容易调试的方式揭示了这个错误(没有,我们会在当前autoreleasepool范围之外的某些东西尝试访问文件句柄时看到崩溃)。
我已在GNUstep Base svn r37245中修复此问题,感谢您的报告(将来,如果发布到GNUstep邮件列表而不是随机的第三方网站,GNUstep错误报告更有可能被看到,然而...)。