Objective-C/ARC/メモリ管理に関する質問は SO で徹底的に行われましたが、これは既存のものとは少し異なるようです。
GNUStep と Clang で Objective-C を使用しようとしています。ARC などの最新の Objective-C 機能に明らかに必要なライブラリをダウンロードしました。ブロックは機能し、@autoreleasepool
s は関連するコンパイラ フラグとともにコンパイラによって受け入れられます。AppKit GUI ツールキットが機能し、キュー ディスパッチャーも機能します。
私の理解が正しければ、 ed オブジェクトは「親」スタック フレームのalloc
終了時に解放するように自動的に設定され、解放すると参照カウントが減少するということです。@autoreleasepool
それでも、コンパイラはマニュアルを嘆くことはなく、マニュアルを[super dealloc]
容認します。これは、ARC がオンになっていないことを意味します。autoreleases
releases
GNUStep ARC ~enable
グーグルが私が見逃しているコンパイラフラグを生成すると想像するかもしれませんが、そうではありません。
コード例を次に示します。これは C99 の多次元配列のオブジェクト ラッパーbool
です。これは でmalloc
編集されinit
、free
内で編集されます。これは、 ARC コード内dealloc
での数少ない正当な使用法の 1 つです。@autoreleasepool 内に単一の参照しか作成されていないにもかかわらず、 @autoreleasepool の終了後に'sが呼び出されないdealloc
ことに注意してください。ただし、マニュアルまたははうまく機能します。dealloc
puts
release
autorelease
#import <stdbool.h>
#import <stdio.h>
#import <stdlib.h>
#import <Foundation/Foundation.h>
@interface Area : NSObject {
bool *area;
size_t width, height;
}
- (id) initWithWidth:(size_t)aWidth height:(size_t)aHeight;
- (void) dealloc;
- (void) display;
@end
@implementation Area
- (id) initWithWidth:(size_t)aWidth height:(size_t)aHeight {
self = [super init];
width = aWidth;
height = aHeight;
area = malloc((sizeof *area) * aWidth * aHeight);
for (size_t y = 0; y < aHeight; ++y) {
for (size_t x = 0; x < aWidth; ++x) {
area[(aHeight * y) + (aWidth * x)] = true;
}
}
return self;
}
- (void) dealloc {
free(area);
puts("DEALLOCATED");
}
- (void) display {
for (size_t y = 0; y < height; ++y) {
putchar('|');
for (size_t x = 0; x < width; ++x) {
putchar(area[(height * y) + (width * x)]
? '#'
: ' ');
}
puts("|");
}
}
@end
int main(void)
{
@autoreleasepool {
id area = [[Area alloc] initWithWidth:10 height:10];
[area display];
}
return EXIT_SUCCESS;
}
私のコンパイルスクリプト(これが機能したら、適切なメイクファイルを使用します):-
#!/bin/sh
INC_FLAG=`gnustep-config --variable=GNUSTEP_SYSTEM_HEADERS`
LIB_FLAG=`gnustep-config --variable=GNUSTEP_SYSTEM_LIBRARIES`
clang -o main main.m \
-I $INC_FLAG \
-L $LIB_FLAG \
\
-fblocks \
-fobj-arc \
-fconstant-string-class=NSConstantString \
-D_NATIVE_OBJC_EXCEPTIONS \
\
-pthread \
-lgnustep-base \
-ldispatch \
-lgnustep-gui \
-lobjc
autorelease
内で作成されたオブジェクトに対して推論されるべきであるという仮定の下にありました@autoreleasepool
。
前もって感謝します!