2013-10-15 54 views
1

我正在嘗試GNUstep。如果它運行良好,我會嘗試使用它創建一個網站。無論如何,我從第一次被卡住了。 GNUstep NSRunLoop實現似乎不能很好地工作。爲什麼GNUstep NSRunLoop會立即退出ARC?

這是我的代碼。

#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 & 

回答

1

這似乎是在GSFileHandle類的錯誤。 fileHandleWithStandardInput返回的單例是autoreleased。在非ARC模式下,它在@autoreleasepool範圍的末尾被銷燬,但你永遠不會達到那個點,所以它工作正常。

在ARC模式下,序列變爲沿着這些路線的東西:

NSFileHandle *tmp = [NSFileHandle fileHandleWithStandardInput]; 
    objc_retainAutoreleasedReturnValue(tmp); 
    [tmp waitForDataInBackgroundAndNotify]; 
    objc_release(tmp); 

調用objc_release()後,對象被釋放。當對象被釋放時,它將自己作爲運行循環源有用地移除。運行循環然後沒有註冊源,因此退出(否則它將永遠等待無)。

這顯示了ARC的一個優點 - 即臨時對象不會在autorelease池中花費太多時間 - 但是在這種情況下它揭示了一個錯誤。幸運的是,它以比沒有ARC更容易調試的方式發現錯誤(沒有,噹噹前autoreleasepool範圍之外的某些東西嘗試訪問文件句柄時,我們會看到崩潰很晚)。

我已經在GNUstep Base svn r37245中修復了這個問題,非常感謝您的報告(在將來,如果發佈到GNUstep郵件列表,而不是隨機的第三方網站,GNUstep錯誤報告更有可能被發現,但是......)。

+0

感謝您解決這個問題。我會等待下一個版本。我也發佈了這個郵件列表來確認它是一個錯誤,但我認爲我的郵件目前正處於審覈階段。 – Eonil