有什么区别
+ (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;
if b == YES,转换成数据后会自动释放字节吗?
我正在开发一个应用程序,几乎完成了它.但最后一个问题是它在设备上运行时因内存错误而崩溃.它只在设备上崩溃,但在模拟器中它是完美的.
"malloc: * error for object 0x17415d0c0: Invalid pointer dequeued from free list * set a breakpoint in malloc_error_break to debug";
Run Code Online (Sandbox Code Playgroud)
我已经在这个问题上工作了好几天: iOS - 我的应用程序崩溃了内存错误,如果只在Device上运行
但最后我发现问题,在我的加密和解密功能中,我有这个:
Byte *buffer = (Byte*)malloc(asciiDataLength);
Run Code Online (Sandbox Code Playgroud)
在我使用缓冲区处理后,我将其转换为NSData:
NSData *plainData = [NSData dataWithBytesNoCopy:buffer length:asciiDataLength freeWhenDone:YES];
Run Code Online (Sandbox Code Playgroud)
此代码导致我的应用程序不断崩溃,我将其更改为
NSData *plainData = [NSData dataWithBytes:buffer length:asciiDataLength];
free(buffer);
Run Code Online (Sandbox Code Playgroud)
然后我的应用程序再也不会崩溃
所以,我必须自己解除Byte,ARC不会为我释放它.
创建并返回包含从给定缓冲区复制的给定字节数的数据对象.
+ dataWithBytesNoCopy:length::
创建并返回一个包含缓冲区
bytes长度字节的数据对象.
dataWithBytes为数据创建缓冲区的副本,而NoCopy版本没有.
重要说明:在以下讨论部分中dataWithBytesNoCopy:length::
返回的对象获取字节指针的所有权,并在取消分配时释放它.因此,
bytes必须指向分配的内存块malloc.
这意味着使用此方法初始化基本上将内存的所有权交给NSData对象,free一旦完成就会释放它.如果您尝试使用未分配的内存对其进行初始化,malloc则在取消分配数据对象时,您的应用程序将崩溃.
dataWithBytesNoCopy当你从其他地方获取缓冲区中的字节时,它很有用,并准备将它们交给NSData对象,并且不会在它之外再次使用它们.
如果您想用自己管理的内存初始化数据,请使用+ dataWithBytesNoCopy:length:freeWhenDone:.如果缓冲区将持久存储在某处,而不是更改或释放,则此选项非常有用.
但是,如果您不确定如何手动正确管理此内存,则最好使用dataWithBytes.出于性能原因存在其他方法,因为避免复制大块数据可以节省大量时间,但如果您不确定如何使用它们,最好不要 - 一个不崩溃的应用程序更可取到一个快速崩溃的应用程序.
| 归档时间: |
|
| 查看次数: |
2668 次 |
| 最近记录: |