考虑以下(无用的)程序,该程序将随机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);
}