2013-10-15 8 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에 의해 리턴 된 싱글 톤은 자동으로 릴리즈됩니다. ARC가 아닌 모드에서는 @autoreleasepool 범위 끝에서 삭제되지만 그 지점까지 도달하지 않으므로 정상적으로 작동합니다. ARC 모드에서

이 시퀀스는이 라인을 따라 뭔가가된다 : objc_release()에 대한 호출 후

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

을 개체가 해제됩니다. 객체가 할당 해제되면 유용한 객체를 실행 루프 소스로 제거합니다. 그런 다음 실행 루프에 등록 된 소스가 없으므로 종료됩니다 (그렇지 않으면 아무것도 기다리지 않습니다).

이것은 임시 객체가 자동 풀 풀에 많은 시간을 소비하지 않는다는 ARC의 장점 중 하나를 보여 주지만,이 경우에는 버그를 발견하게됩니다. 다행스럽게도 ARC가없는 경우보다 버그를 훨씬 쉽게 디버그 할 수 있습니다 (없으면 현재 autoreleasepool 범위 밖에있는 파일 핸들에 액세스하려고 할 때 크래시가 발생합니다).

GNUstep Base svn r37245에서 수정했습니다 (향후 GNUstep 버그 리포트는 임의의 제 3 자 웹 사이트보다 GNUstep 메일 링리스트에 게시 될 경우 더 많이 볼 수 있습니다). , 그러나 ...).

+0

고마워요. 나는 다음 출시를 기다릴 것이다. 나는 메일 링리스트에 이것을 bug로 확인하기 위해 올렸지 만, 현재 나의 메일은 온건 한 상태라고 생각합니다. – Eonil