9

Objective-C/ARC/メモリ管理に関する質問は SO で徹底的に行われましたが、これは既存のものとは少し異なるようです。

GNUStep と Clang で Objective-C を使用しようとしています。ARC などの最新の Objective-C 機能に明らかに必要なライブラリをダウンロードしました。ブロックは機能し、@autoreleasepools は関連するコンパイラ フラグとともにコンパイラによって受け入れられます。AppKit GUI ツールキットが機能し、キュー ディスパッチャーも機能します。

私の理解が正しければ、 ed オブジェクトは「親」スタック フレームのalloc終了時に解放するように自動的に設定され、解放すると参照カウントが減少するということです。@autoreleasepoolそれでも、コンパイラはマニュアルを嘆くことはなく、マニュアルを[super dealloc]容認します。これは、ARC がオンになっていないことを意味します。autoreleasesreleases

GNUStep ARC ~enableグーグルが私が見逃しているコンパイラフラグを生成すると想像するかもしれませんが、そうではありません。

コード例を次に示します。これは C99 の多次元配列のオブジェクト ラッパーboolです。これは でmalloc編集されinitfree内で編集されます。これは、 ARC コード内deallocでの数少ない正当な使用法の 1 つです。@autoreleasepool 内に単一の参照しか作成されていないにもかかわらず、 @autoreleasepool の終了後に'sが呼び出されないdeallocことに注意してください。ただし、マニュアルまたははうまく機能します。deallocputsreleaseautorelease

#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

前もって感謝します!

4

1 に答える 1

7

解決策: Josh Caswell は、私のコンパイラ フラグfobj-arcfobjc-arc. Clang がこのフラグが無効であることを示していないことを考えると、この回答は他の人に任せます。

于 2013-11-10T22:23:32.290 に答える