2013-10-15 10 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 программа не завершает работу и просто продолжает работать. Он работал одинаково под GNUstep на FreeBSD, если я не использую ARC. Если я включу 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, последовательность становится чем-то вдоль этих линий:

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

После вызова objc_release(), объект освобождается. Когда объект освобождается, он успешно удаляет себя как источник цикла запуска. Тогда цикл цикла не имеет зарегистрированных источников и поэтому выходит (иначе он будет ждать вечно зря).

Это показывает одно из преимуществ ARC: временные объекты не тратят столько времени на пулы автоопределений, но в этом случае он обнаруживает ошибку. К счастью, он обнаруживает ошибку гораздо проще для отладки, чем без ARC (без этого мы увидим крах намного позже, когда что-то вне текущей области autoreleasepool пытается получить доступ к дескриптору файла).

Я исправил это в базе GNUstep svn r37245, благодарю вас за отчет (в будущем отчеты об ошибках GNUstep более вероятны, если их отправят в списки рассылки GNUstep, чем на случайный сторонний веб-сайт , Однако...).

+0

Спасибо за исправление этого. Я буду ждать следующего выпуска. Я также разместил это в списке рассылки, который будет подтвержден как ошибка, но я думаю, что моя почта в настоящее время находится в модерации. – Eonil