前言

	@interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
@interface NSMutableData : NSData
  • NSData 和它的可变长子类 NSMutableData 是字节缓冲区的对象化封装。我们可以获得简单缓冲区,并进行一些转换操作。通常我们并不会直接创建字节数据,而是从其他类型的内容转换成字节数据。

  • 所谓简单缓冲区,就是缓冲区内只包含数据,无内嵌指针。

  • 对于 32 位应用程序,NSData 的缓冲区最多可以存储 2GB 数据。对于 64 位应用程序,最多可以存储 8EB(即 8 亿 GB) 数据。

1、NSData 的创建

	// 对象方法创建
NSData *data1 = [[NSData alloc] init];
NSData *data2 = [[NSData alloc] initWithData:data1]; // 类方法创建
NSData *data3 = [NSData data];
NSData *data4 = [NSData dataWithData:data3]; // 由 文件 创建
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"]; NSData *data5 = [[NSData alloc] initWithContentsOfFile:filePath];
NSData *data6 = [NSData dataWithContentsOfFile:filePath]; // 由 URL 创建
NSURL *urlPath = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory()
stringByAppendingString:@"/Desktop/test.txt"]]]; NSData *data7 = [[NSData alloc] initWithContentsOfURL:urlPath];
NSData *data8 = [NSData dataWithContentsOfURL:urlPath]; // 由 字符串 创建
NSString *string = @"bei jing nin hao"; NSData *data9 = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *data10 = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; // 可变 NSData 的创建 // 初始化时指定对象拥有的字节空间大小,在需要时会增加内存空间,在初始化时并没有分配内存空间
NSMutableData *data11 = [[NSMutableData alloc] initWithCapacity:5];
NSMutableData *data12 = [NSMutableData dataWithCapacity:5]; // 初始化时为对象分配指定长度的归零字节
NSMutableData *data13 = [[NSMutableData alloc] initWithLength:10];
NSMutableData *data14 = [NSMutableData dataWithLength:10];

2、NSData 长度的计算

	NSData *data1 = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];

	// 指定空间大小,不分配空间
NSMutableData *data2 = [NSMutableData dataWithCapacity:5]; // 分配指定长度的归零字节
NSMutableData *data3 = [NSMutableData dataWithLength:10]; // 字节长度的计算,NSData 的 length 属性是只读的
NSUInteger length1 = data1.length; // 字节长度的计算,NSMutableData 的 length 可以被重新赋值
NSUInteger length2 = data2.length; NSUInteger length3 = data3.length; // 重新设置空间的大小,对象的字节空间会相应的扩充或者截断。如果新设置的大小大于当前大小,会在当前数据的
data2.length = 15; // 末尾处用归零字节来进行填充。如果新设置的大小小于当前大小,数据会被截断抛弃。
data3.length = 15; // 扩充指定长度,新添加的空间被设置为归零字节
[data2 increaseLengthBy:5];
[data3 increaseLengthBy:5];

3、NSData 数据的获取

	NSData *data = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];

	// 默认为内容数据的十六进制编码
NSString *str1 = data.description; NSString *str2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *str3 = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];

4、NSData 的比较

	NSData *data1 = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];
NSData *data2 = [NSData dataWithData:data1]; // 比较两个对象的地址是否一致
BOOL bl1 = data1 == data2; // 比较两个对象的长度及每字节的数据是否相同
BOOL bl2 = [data1 isEqualToData:data2];

5、NSData 的存储

	NSData *data = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];

	// 将数据写入 file
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/NSDataTest.txt"];
BOOL bl1 = [data writeToFile:filePath atomically:YES]; // 将数据写入 URL // 该方法只支持 file:// 路径的文件写入,并不能对远程如 http:// 等类型文件进行写入
NSURL *urlPath = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory()
stringByAppendingString:@"/Desktop/NSDataTest.txt"]]];
BOOL bl2 = [data writeToURL:urlPath atomically:YES];

6、NSData 与 NSString 的相互转换

	NSString *string = @"bei jing nin hao";

	// NSString 转 NSData
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; // data 类型数据以十六进制的形式打印出
NSLog(@"%@", data); // data 类型数据以字符串的形式打印出
NSLog(@"%s", data.bytes); // NSData 转 NSString
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

iOS - OC NSData 数据的更多相关文章

  1. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

  2. iOS - OC PList 数据存储

    前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...

  3. iOS - OC NSUserDefaults 数据存储

    前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults ...

  4. iOS - Swift NSData 数据

    前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public class NSMutabl ...

  5. php接口 接受ios或android端图片; php接收NSData数据

    备注下, [自己无意中用的方法]接收时,设置两个参数,一个是图片名称,另一个是实际文件.然后用$_FILES处理就可以了. 如: $icon = $_POST['icon'];//这个是图片的名称,用 ...

  6. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  7. ios+oc面试题

    ios+oc面试题     浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...

  8. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  9. iOS开发网络数据之AFNetworking使用

    iOS开发网络数据之AFNetworking使用 如何选择AFNetworking版本 首先得下载AFNetworking库文件,下载时得首先弄清楚,你将要开发的软件兼容的最低版本是多少.AFNetw ...

随机推荐

  1. 在使用Myeclipse时,用Tomcat添加部署项目的时候报错,或启动tomcat报错

    the selected server is enabled,but is not configured properly.deployment to it will not be permitted ...

  2. css改变背景透明度【转】

    兼容主流浏览器的CSS透明代码: .transparent_class { filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity: 0. ...

  3. C#:插件、框架

    1.开源实体映射框架EmitMapper(http://www.cnblogs.com/wuhong/archive/2011/09/21/2184313.html) 2.ffmpeg.exe是一个源 ...

  4. 百度地图瓦片原理 | 百度map使用教程

    百度地图瓦片原理: http://blog.csdn.net/mygisforum/article/details/22997879 百度map使用教程: http://www.myexception ...

  5. 杭电1005-Number Sequence

    问题描述 A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2) ...

  6. Mix and Build(简单DP)

    Mix and Build Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3936 Accepted: 1203 Case Ti ...

  7. vs智能提示突然消失的解决办法 (vs2008 vs2010 vs2012 智能提示)

    vs智能提示突然消失的解决办法 (vs2008 vs2010 vs2012 智能提示) 下面一段话是网上找到的解决方案: 重置Visual Studio可以解决此问题,方法是从开始->Micro ...

  8. Codeforces Round #368 (Div. 2) B

    Description Masha wants to open her own bakery and bake muffins in one of the n cities numbered from ...

  9. c++类中的常量

    C++类中的常量 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现.const 数据成员的确是存在的,但其含义却不是我们所期望的.cons ...

  10. 2016年11月10日 星期四 --出埃及记 Exodus 20:1

    2016年11月10日 星期四 --出埃及记 Exodus 20:1 And God spoke all these words: 神吩咐这一切的话说,