iOS开发iOS Developer

ios-NSData-->dataWithBytesNoC

2017-07-07  本文已影响500人  简鱼7819

项目中遇到的问题,根据项目需要我需要把指定的数据(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

个人开发随笔,不喜勿喷,谢谢!

上一篇下一篇

猜你喜欢

热点阅读