关于NSData
的Apple文档说
NSData
及其可变子类NSMutableData
提供数据对象,面向对象的字节缓冲区包装器。数据对象允许简单分配的缓冲区(即没有嵌入指针的数据)采用Foundation对象的行为。
“嵌入式指针”是什么意思?我的理解是,一旦你把字节放入其中,它就不知道它是什么,除非你在应用程序级解码它。有人知道他们在说什么吗?
答案 0 :(得分:5)
NSData的目的是提供一种在不再需要时清理已分配数据缓冲区的方法,即当NSData的引用计数变为0时。在常见情况下,数据分配有malloc和NSData使用相应的调用以释放数据。这限制了字节数据的性质。它必须是普通旧数据。如果数据是一个包含字段的结构,该字段指向使用malloc(嵌入指针)分配的另一个内存区域,则嵌入式指针永远不会被NSData对象释放,从而导致内存泄漏。例如:
typedef struct Point {
CGFloat x,
CGFloat y
} Point;
typedef struct LineSegment {
Point* start;
Point* end;
} LineSegment;
// point does not contain any embedded pointers (i.e., it is Plain Old Data)
Point* point = malloc(sizeof(Point));
// pointData will call free on point to deallocate the memory allocated by malloc
NSData* pointData = [NSData dataWithBytesNoCopy:point length:sizeof(Point)];
Point* start = malloc(sizeof(Point));
Point* end = malloc(sizeof(Point));
// line contains two embedded pointers to start and end. Calling free on line
// without calling free on start and end will leak start and end
LineSegment* line = malloc(sizeof(LineSegment));
line->start = start;
line->end = end;
// start and end will be leaked!
NSData* lineData = [NSData dataWithBytesNoCopy:&line length:sizeof(LineSegment)];
// Try this instead. Line is now Plain Old Data
typedef struct Line {
Point start;
Point end;
} Line;
// anotherLine does not contain any embedded pointers and can safely be used with
// NSData. A single call to free will deallocate all memory allocated for anotherLine
// with malloc
Line* anotherLine = malloc(sizeof(Line));
NSData* anotherLineData = [NSData dataWithBytesNoCopy:&anotherLine
length:sizeof(Line)];
答案 1 :(得分:1)
是的,这就是他们所说的。 NSData是纯序列化数据,是一个字节数组。必须在应用程序代码中添加任何结构,并且对外部存储器的引用没有多大意义(NSData等数据对象应该是自包含的,或者至少以不依赖于确切内存位置的方式引用事物,所以它是可运输的)。他们只是想明确一点。