Objective c 当NSString的长度减少时,内存是否被释放,或者我是否需要做更多的事情?

Objective c 当NSString的长度减少时,内存是否被释放,或者我是否需要做更多的事情?,objective-c,ios,memory,Objective C,Ios,Memory,如果我有以下代码: NSString* test = @"12345... 1Kb worth of characters"; test = [test substringFromIndex:512]; 那么测试消耗的内存会减半(从1024字节减到512字节),还是我必须做些什么来告诉它释放内存 谢谢 Joe因为您引用的内存是静态分配的-在这种情况下,您没有问题 NSString* test = @"12345... 1Kb worth of characters"; test = [test

如果我有以下代码:

NSString* test = @"12345... 1Kb worth of characters";
test = [test substringFromIndex:512];
那么测试消耗的内存会减半(从1024字节减到512字节),还是我必须做些什么来告诉它释放内存

谢谢


Joe

因为您引用的内存是静态分配的-在这种情况下,您没有问题

NSString* test = @"12345... 1Kb worth of characters";
test = [test substringFromIndex:512];
但是,在下列情况下:

NSString *s = [@"some long string" retain];
s = [s substringFromIndex:someLongNumber];

您可能会出现内存泄漏,因为
s
在第二次赋值时占用的内存将丢失其引用,从而使您无法最终释放以前在
s

引用的位置中占用的内存,在该调用之后,将
为子字符串分配新内存。但是您的字符串
test
被标记为
autoreleased
。因此,
test
的先前值将自动
发布
,并分配新值。请注意,新值(子字符串)将过于
自动删除
,您不需要
手动释放它。

是和否。 不,只要字符串没有保留在其他地方,垃圾收集器就会在稍后释放内存。(是的,这里有一个,我们只是有更多的控制,当/如果一个对象被破坏,整个方法并不是完全由书中的垃圾收集器来控制,但这就是细节。)


是的,有时迟一点。有一段时间,您使用booth对象的内存。:)

NSString*test=@“12345…1Kb的字符”//自动释放。->这是不对的。字符串文字是在堆栈上而不是在堆上创建的。要测试它,请创建NSString*test;对于类范围,在方法test=@“2432”中,在下一个方法中尝试NSLog(@“test string%@”,test);字符串文字不是自动释放的对象。实际上,指向字符串文字的指针在堆栈上-字符串本身是可执行的静态数据部分中的一个不可变的数据块。释放字符串只会释放NSString对象;字符串本身仍将位于内存中。@Nikita常量字符串位于可执行文件本身中。Objective-C中唯一的堆栈分配对象是未复制的块。最好说字符串不属于该特定代码。从技术上讲,该字符串不会自动释放。