可以信任objective-c(非ARC)自动释放内存管理机制吗?

时间:2014-04-09 10:07:12

标签: objective-c cocoa memory-management nsautoreleasepool

考虑以下(无用的)程序,该程序将随机NSStrings放入NSMutableArray的前4个槽中。在数组中替换了字符串后,我不再需要它,因此我想释放它,但是因为我用stringWithCString创建它,所以我不应该担心它的释放。别人会照顾的,所以我可以去海滩,担心我的晒黑。

右?
错了:这个程序开始耗费大量内存!

因此我毕竟一定要担心记忆管理...
解决方案很简单:使用alloc和initWithCString创建NSString,然后 手动释放。
我的问题是:我错过了什么吗? 当我用一种不能让我成为该对象的所有者的方法创建一个对象时,我是否总是不得不担心内存浪费?因此,其他人应该在“适当的时间”发布?

#import <stdio.h>
#import <Foundation/Foundation.h>

#define NBYTES 10000

int main( int argc, const char *argv[] ) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

int i;
char input[100];
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", @"3", nil];

// Create 4 long strings
static char buffer[4][NBYTES];
memset( buffer[0], 'A', NBYTES );
memset( buffer[1], 'B', NBYTES );
memset( buffer[2], 'C', NBYTES );
memset( buffer[3], 'D', NBYTES );
for (i=0; i<4; i++) {
    buffer[i][NBYTES-1] = 0;
}

int n = 10000;
for (i=0; i<n; i++) {
    int j = random() & 0x3;   // a random integer between 0 and 3
    int k = random() & 0x3;   // a random integer between 0 and 3
    NSString *str = [NSString stringWithCString:buffer[j] encoding:NSASCIIStringEncoding];
    [list replaceObjectAtIndex:k withObject:str];

    // I cannot release str since I created it with
    // stringWithCString, hence I'n not owner.
    // If I try to release str in fact I get segmentation fault
    // when [pool drain] is executed
    // [str release];
}

printf("check memory usage now\n");
fgets( input, 2, stdin );

[pool drain];
return(0);
}

0 个答案:

没有答案