ios - dataWithBytesNoCopy 和 dataWithBytes 之间的区别?

标签 ios byte nsdata

有什么区别

+ (instancetype)dataWithBytes:(const void *)bytes length:(NSUInteger)length;

+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;

此外,

+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;

如果b == YES,转换成数据后会自动释放字节吗?

我正在开发一个应用程序并且几乎完成了它。但最后一个问题是它在设备上运行时因内存错误而崩溃。它只会在设备上崩溃,但在模拟器中它是完美的。

"malloc: * error for object 0x17415d0c0: Invalid pointer dequeued from free list * set a breakpoint in malloc_error_break to debug";

几天来我一直在研究这个问题: iOS - My app crashes with memory Error if only runs on Device

但最后我发现了问题,在我的加密和解密函数中,我有这个:

Byte *buffer    = (Byte*)malloc(asciiDataLength);

处理缓冲区后,我将其转换为 NSData:

NSData *plainData = [NSData dataWithBytesNoCopy:buffer length:asciiDataLength freeWhenDone:YES];

此代码导致我的应用程序不断崩溃,我将其更改为

NSData *plainData = [NSData dataWithBytes:buffer length:asciiDataLength];
free(buffer);

然后我的应用程序再也不会崩溃了。

所以我必须自己释放字节,ARC 不会为我释放它。

最佳答案

+ dataWithBytes:length: :

Creates and returns a data object containing a given number of bytes copied from a given buffer.

+ dataWithBytesNoCopy:length: :

Creates and returns a data object that holds length bytes from the buffer bytes.

dataWithBytes 为数据复制缓冲区,而 NoCopy 版本则没有。

重要说明:在dataWithBytesNoCopy:length:的讨论部分:

The returned object takes ownership of the bytes pointer and frees it on deallocation. Therefore, bytes must point to a memory block allocated with malloc.

这意味着使用此方法初始化实质上将内存的所有权交给了 NSData 对象,该对象将在完成后使用 free 释放它。如果您尝试使用未使用 malloc 分配的内存对其进行初始化,则您的应用程序将在数据对象被释放时崩溃。

dataWithBytesNoCopy 当您从其他地方获取缓冲区中的字节并准备将它们交给 NSData 对象时很有用,并且不会使用在那之外又是他们自己。

如果你想用你自己管理的内存初始化数据,使用+ dataWithBytesNoCopy:length:freeWhenDone: .如果缓冲区将永久存储在某处并且不会更改或释放,这将很有用。

但是,如果您不确定如何手动正确管理此内存,最好使用 dataWithBytes。其他方法是出于性能原因而存在的,因为避免复制大块数据可以节省大量时间,但如果您不确定如何使用它们,最好不要使用 - 最好不要使用不会崩溃的应用程序到快速崩溃的应用程序。

关于ios - dataWithBytesNoCopy 和 dataWithBytes 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326012/

相关文章:

ios - NSCalendar dateFromComponents 返回奇怪的日期

ios - 使用Facebook登录,并以IsCancelled身份将FBSDKLoginManagerLoginResult面对IOS 11中始终为true

ios - App Store 提交的最低 Xcode/swift 版本

ios - 如何获取流字节并转换回图像 - IOS

ios - 通过字节数组将图像从 iOS 发送到 .net 服务器

android - flutter 力释放前景

c# - 无法转换为特定格式 C#

Python 字符串到字节的转换。双反斜杠问题

ios - 如何在上传到服务器之前在 iOS 上压缩/调整图像?

iphone - GameKit:向其他玩家发送可靠的 NSData?