Linux の gnustep 環境でARC の書き戻しを確認したい(この記事で準備した)。
私はmain.mファイルを持っています:
#import <Foundation/Foundation.h>
__weak id obWeak;
int writeBack(id *);
int main(int argc, char * argv[]) {
@autoreleasepool {
id object;
writeBack(&object);
NSLog(@"object(%@) weak(%@)", object, obWeak);
object=nil;
NSLog(@"object(%@) weak(%@)", object, obWeak);
}
NSLog(@"weak %@", obWeak);
return 0;
}
int writeBack(id * aValue){
*aValue=[NSObject new];
obWeak = *aValue;
return 0;
}
GNUmakefile :
include $(GNUSTEP_MAKEFILES)/common.make
CC=clang
TOOL_NAME = CmdTest
${TOOL_NAME}_OBJCFLAGS = -fobjc-arc
${TOOL_NAME}_BUNDLE_LIBS += -lobjc -lgnustep-base
${TOOL_NAME}_OBJC_FILES = main.m
include $(GNUSTEP_MAKEFILES)/tool.make
および Linuxコンソール出力:
2013-03-28 13:50:33.840 CmdTest[7751] object(<NSObject: 0x2068c38>) weak(<NSObject: 0x2068c38>)
2013-03-28 13:50:33.842 CmdTest[7751] object((null)) weak(<NSObject: 0x2068c38>)
Segmentation fault (core dumped)
ご覧のとおり、@autoreleasepool ブロックの外側から NSLog(@"weak %@", obWeak) を呼び出そうとすると、セグメンテーション違反 (コア ダンプ)が発生しました。
Mac PC の XCode でこのコードをコンパイルしようとしましたが、エラーは発生しませんでした。何が問題なのかを理解するのを手伝ってもらえますか?