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]和容忍手动autoreleases和releases,这意味着ARC甚至没有接通.
有人可能会想到谷歌搜索GNUStep ARC ~enable会产生一些我错过的编译器标志,但事实并非如此.
这是一些示例代码.它是C99 bool的多维数组的对象包装器,它被malloc编入内部init和free内部dealloc,我收集的是deallocARC代码中为数不多的合法用途之一.注意dealloc的puts是不能在@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.
提前致谢!
| 归档时间: |
|
| 查看次数: |
1762 次 |
| 最近记录: |