- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有什么区别
+ (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 不会为我释放它。
最佳答案
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 withmalloc
.
这意味着使用此方法初始化实质上将内存的所有权交给了 NSData
对象,该对象将在完成后使用 free
释放它。如果您尝试使用未使用 malloc
分配的内存对其进行初始化,则您的应用程序将在数据对象被释放时崩溃。
dataWithBytesNoCopy
当您从其他地方获取缓冲区中的字节并准备将它们交给 NSData
对象时很有用,并且不会使用在那之外又是他们自己。
如果你想用你自己管理的内存初始化数据,使用+ dataWithBytesNoCopy:length:freeWhenDone:
.如果缓冲区将永久存储在某处并且不会更改或释放,这将很有用。
但是,如果您不确定如何手动正确管理此内存,最好使用 dataWithBytes
。其他方法是出于性能原因而存在的,因为避免复制大块数据可以节省大量时间,但如果您不确定如何使用它们,最好不要使用 - 最好不要使用不会崩溃的应用程序到快速崩溃的应用程序。
关于ios - dataWithBytesNoCopy 和 dataWithBytes 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326012/
我是 iOS 编程的新手。我有一个带签名的函数 (NSData*) Decrypt; 在函数中我必须从 char* 缓冲区构建 NSData* 并且我正在尝试这三个函数。 NSData *return
有什么区别 + (instancetype)dataWithBytes:(const void *)bytes length:(NSUInteger)length; 和 + (instancetype
它仅在 iOS7 上崩溃 +(PageSection *)initwithPageSection:_anchor withHeader:_subHeader withDetails:_text wit
我是一名优秀的程序员,十分优秀!