项目中遇到的问题,根据项目需要我需要把指定的数据(NSString,NSDictionary,NSArray)转化成NSData数据类型,并且转化时指定固定的长度length。
所以采用了以下方法👇
NSData *data2 = [NSData dataWithBytesNoCopy:(nonnull void *) length:(NSUInteger)]
如果单个使用该方法没有什么问题,但是项目需要把它放入for循环语句中,结果循环一旦>1,app直接崩溃。
原因:指针丢失,内存泄漏,Pointer being freed was not allocated
for循环中dataWithBytesNoCopy,根据传进去的bytes实际上是生产多个NSData对象,然而当一个for循环成功后NSData对象会被release,同时bytes也被顺带release掉了,等到for循环下一轮开始后,NSData的对象再次释放,编译器接着想要释放bytes时,但此时bytes已经被释放掉了,出现了Double Free的错误。
解决方法:
1,使用dataWithBytesNoCopy中参数freeWhenDone,当freeWhenDone:NO时的确可以解决Double Free问题。
2,单单对于这个项目需求,可以转换思路,不使用dataWithBytesNoCopy_length的方法,采用NSMutableData自己手动拼接成固定长度的data。
参考资料:
http://www.itstrike.cn/Question/151dd68e-a851-4534-85be-7ab8736b39f8.html
http://blog.csdn.net/ooaven/article/details/18276119
个人开发随笔,不喜勿喷,谢谢!