程序启动后执行viewDidLoad
,但是内存一直在增长,如下图.每次大约增加0.2M
,应该是while
循环中局部变量data
没释放导致的.该如何解决?
- (void)viewDidLoad {
[super viewDidLoad];
staitc int EVERBUFFERLEN = 2000;
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"wakeup.pcm" ofType:nil]];
NSMutableData *mData = [NSMutableData dataWithData:data];
int readLength = 0;
while (readLength < mData.length) {
if (mData.length - readLength > EVERBUFFERLEN) {
NSData *data = [mData subdataWithRange:NSMakeRange(readLength, EVERBUFFERLEN)];
readLength += EVERBUFFERLEN;
[NSThread sleepForTimeInterval:0.01];
data = nil;
}
}
如果循环很多,可以手动加上释放池:
@autoreleasepool {
your code
}
例如你的代码改为:
- (void)viewDidLoad {
[super viewDidLoad];
staitc int EVERBUFFERLEN = 2000;
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"wakeup.pcm" ofType:nil]];
NSMutableData *mData = [NSMutableData dataWithData:data];
int readLength = 0;
while (readLength < mData.length) {
if (mData.length - readLength > EVERBUFFERLEN) {
@autoreleasepool {
NSData *data = [mData subdataWithRange:NSMakeRange(readLength, EVERBUFFERLEN)];
readLength += EVERBUFFERLEN;
[NSThread sleepForTimeInterval:0.01];
data = nil;
}
}
}
为工程师推荐兼职,详情点我头像
NSThread线程中不要使用NSData的subdataWithRange方法
转来的,你可以看看
楼主确定这这些代码引起的内存增长吗?如果确定,可以在这个函数入口加个断点,然后一步一步的调试,看看走完哪一行代码后内存有的增长
代码没给全吧,也没看出来对data做了啥操作啊。另外,在主线程调用sleepForTimeInterval会卡住UI线程的。