Objective-C:如何在GNUStep中启用ARC?

Lou*_*man 9 memory-management objective-c autorelease gnustep automatic-ref-counting

Objective-C/ARC /内存管理问题已经针对SO进行了死亡,但这个问题与现有问题略有不同.

我一直在尝试将Objective-C与GNUStep和Clang一起使用.我已经下载了现代Objective-C功能所需的库,如ARC; 块工作和@autoreleasepool编译器接受s以及相关的编译器标志.AppKit GUI工具包可以工作,队列调度程序也可以.

我的理解是,如果正确的话,alloced对象会自动设置为在退出@autoreleasepool"父"堆栈帧时释放,并且释放会减少引用计数.然而,编译器不会哀叹手动[super dealloc]和容忍手动autoreleasesreleases,这意味着ARC甚至没有接通.

有人可能会想到谷歌搜索GNUStep ARC ~enable会产生一些我错过的编译器标志,但事实并非如此.

这是一些示例代码.它是C99 bool的多维数组的对象包装器,它被malloc编入内部initfree内部dealloc,我收集的是deallocARC代码中为数不多的合法用途之一.注意deallocputs不能在@autoreleasepool结束后,被称为尽管有仅是在它创造了一个单一的参考.一本手册,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;
}
Run Code Online (Sandbox Code Playgroud)

我的编译脚本(一旦我有了这个工作,我将使用正确的makefile): -

#!/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
Run Code Online (Sandbox Code Playgroud)

我一直在假设autorelease应该推断出在其中创建的对象@autoreleasepool.

提前致谢!

Lou*_*man 7

解决方案:Josh Caswell指出我的编译器标志fobj-arc应该是fobjc-arc.鉴于Clang没有给出这个标志无效的指示,我会把这个答案留给其他人.