OC 在循环体中调用[NSString stringWithFormat:@"%@",Object] 方法的内存问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC 在循环体中调用[NSString stringWithFormat:@"%@",Object] 方法的内存问题。相关的知识,希望对你有一定的参考价值。

Person *p=[[Person alloc]init];

for (int i = 0; i < 10000000; ++i)

// 1 @autoreleasepool

[NSString stringWithFormat:@"%@", p];

// 3


补充:如果在循环体中不添加自动释放池(1、3)就会导致内存无限增长,求大神指点,详细说明原因,谢谢。

参考技术A 新版本的OC是使用ARC模式来解决对象的释放问题,核心思想是这个对象没有强指针指向时就释放这个对象,你把代码放入自动释放池里面,自动释放池结束时就会导致创建的对象被释放。NSString这个方法是使用格式化控制符来创建字符串,OC中字符串也是对象,它在内存中会一直创建,所以会无限增加内存追问

感谢你的回答,其实我不明白的是一次循环结束后,[NSString stringWithFormat:@"%@", p];

创建的对象应该被销毁,第二次循环时候重新创建就不会导致内存无限增长。一次循环结束后对象应该没有强制指针指向,所以不会有内存占用。如图:

 

当程序执行到1的位置即为一次循环,此时局部变量array会被销毁,哪里那么array指向的内存空间也应该会被销毁。

如你所说:OC中字符串也是对象,它在内存中会一直创建,所以会无限增加内存?
循环中字符串创建完毕之后如果没有强指针指向是否会立即销毁,如果有那么是谁在指向?

Foundation框架系列-NSString

NSString

OC字符串与C语言字符串转换

NSString *str = @"Hello world ! !";
// OC字符串 --> C语言字符串
char *c = [str UTF8String];

// C字符串 --> OC语言字符串
char *c = "Hello world ! !";
NSString *str = [[NSString alloc] initWithUTF8String:c];

从文件中读取字符串

// 文件的绝对路径
NSString *str1 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:nil];
    
// 资源
NSURL *url = [NSURL URLWithString:@"file:///Users/apple/Desktop/abc.txt"];
NSString *str2 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

获取字符串中指定内容的NSRange

NSString *str = @"Hello world";
// 获取字符串
NSRange range = [str rangeOfString:@"Hello"];

字符串的截取

NSString *str = @"HelloWorld";

// 指定index开始截取字符串(包含index)
NSString *str2 = [str substringFromIndex:2];

// 从字符串开始位置开始截取到index(不包含index)
NSString *str2 = [str substringToIndex:3];

// 从index开始包含index截取长度为length的字符串
NSString *str2 = [str substringWithRange:NSMakeRange(2, 2)];

// 从字符串中截取已知字符后面的全部内容
NSString *str = @"wechat://router";
NSRange chemeRange = [str rangeOfString: @"wechat://"];
NSString *str2 = [str substringFromIndex:chemeRange.location + chemeRange.length];
NSLog(@"\nstr2 = %@", str2); // 输出结果: router

以上是关于OC 在循环体中调用[NSString stringWithFormat:@"%@",Object] 方法的内存问题。的主要内容,如果未能解决你的问题,请参考以下文章

oc09--NSString

技术分享-swift防御编程

技术分享-swift防御编程

RunTime的一些用法

OC第二节 —— NSString和NSMutableString

从强制解包看 Swift 的设计