NSData全部API学习。

学习NSData,在网上找资料竟然都是拷贝的纯代码,没人去解释。在这种网上没资料的情况下,整理这个API文件好难,好艰辛。在这贡献给大家了,么么哒~示例程序用红色标注。

/****************        Base 64 Options****************/

/*** Base64是一组二进制到文本转化的方案,以ASSCII格式表示二进制数据,这些方案用来编码二进制数据以存储或者通过把多媒体文件转换成文本数据进行传输,这个能保证数据在传输的过程中的完整性。Base64醉常见的用于是处理电子邮件附件,或者解码小图片。在iOS7之前,Base64的编码和解码是需要自己实现的或者是使用第三方库,但是现在苹果提供一些API来实现Base64功能 ***/

//4.base64编码中的一些设置选择

typedef NS_OPTIONS(NSUInteger,
NSDataBase64EncodingOptions) {

NSDataBase64Encoding64CharacterLineLength = 1UL << 0,

NSDataBase64Encoding76CharacterLineLength = 1UL << 1,

NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,

NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,

} NS_ENUM_AVAILABLE(10_9, 7_0);

//5.base64在解码过程中的option可选条件,下面选项表示在将诶吗过程中忽略不能识别的字节

typedef NS_OPTIONS(NSUInteger,
NSDataBase64DecodingOptions) {

NSDataBase64DecodingIgnoreUnknownCharacters = 1UL << 0

} NS_ENUM_AVAILABLE(10_9, 7_0);

/****************
Immutable Data不可变的Data****************/

@interface NSData
: NSObject <NSCopying, NSMutableCopying, NSSecureCoding>

//6.获取data长度的属性

@property (readonly) NSUInteger length;

//7.返回data对象的首指针

@property (readonly) const void *bytesNS_RETURNS_INNER_POINTER;

@end

@interface NSData (NSExtendedData)

//8.返回一个ASCII编码格式的字符串,采用的格式是data属性列表的格式。

@property (readonly, copy) NSString *description;

//9.取出data中指定长度的字节存入buffer这个提前声明的数组中

- (void)getBytes:(void *)buffer
length:(NSUInteger)length;

//9.取出data中指定位置range的字节存入buffer这个提前声明的数组中

- (void)getBytes:(void *)buffer
range:(NSRange)range;

//10.判断两个data是否相等

- (BOOL)isEqualToData:(NSData *)other;

//11.截图data指定位置的子data

- (NSData *)subdataWithRange:(NSRange)range;

//12.将data写入指定的文件

- (BOOL)writeToFile:(NSString *)path
atomically:(BOOL)useAuxiliaryFile;

//13.将data写入指定的url

- (BOOL)writeToURL:(NSURL *)url
atomically:(BOOL)atomically;

//14.将data写入指定文件,并且有写入过程的设置条件,带错误信息

- (BOOL)writeToFile:(NSString *)path
options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;

//15.将data写入指定的url,并且有写入过程的设置条件,带错误信息

- (BOOL)writeToURL:(NSURL *)url
options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;

//16.搜索在data1内部存在data2的位置,并且有搜索配置条件,并且可加入搜索的范围

- (NSRange)rangeOfData:(NSData *)dataToFind
options:(NSDataSearchOptions)mask range:(NSRange)searchRange NS_AVAILABLE(10_6, 4_0);

//17.列举遍历字典的方法

- (void) enumerateByteRangesUsingBlock:(void (^)(constvoid *bytes, NSRange byteRange, BOOL *stop))block NS_AVAILABLE(10_9, 7_0);

@end

/*** 创建data的所有相关方法作为一个类别几种到一块 ***/

@interface NSData (NSDataCreation)

//18.data的快速创建办法

+ (instancetype)data;

//19.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容

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

//20.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。

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

//21.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。当flag为yes的时候,生成的data对象是bytes的所有者,当data对象被释放的时候也会同时释放bytes,所以bytes必须是通过malloc在堆上分配的内存。当flag为no的时候,bytes不会被自动释放,释放bytes时要注意时机,不要再data对象还被使用的时候释放bytes。

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

//22.加载file文件,并且有可选择读取文件的选项配置条件,带有错误信息

+ (instancetype)dataWithContentsOfFile:(NSString *)path
options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

//23.加载url,并且有可选择读取文件的选项配置条件,带有错误信息

+ (instancetype)dataWithContentsOfURL:(NSURL *)url
options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

//24.从参数path指定的文件读入二进制数据,用该数据初始化NSData对象。

+ (instancetype)dataWithContentsOfFile:(NSString *)path;

//25.从参数path指定的url读入,用该数据初始化NSData对象。

+ (instancetype)dataWithContentsOfURL:(NSURL *)url;

//26.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容

- (instancetype)initWithBytes:(const void *)bytes
length:(NSUInteger)length;

//27.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。

- (instancetype)initWithBytesNoCopy:(void *)bytes
length:(NSUInteger)length;

//28.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。当flag为yes的时候,生成的data对象是bytes的所有者,当data对象被释放的时候也会同时释放bytes,所以bytes必须是通过malloc在堆上分配的内存。当flag为no的时候,bytes不会被自动释放,释放bytes时要注意时机,不要再data对象还被使用的时候释放bytes。

- (instancetype)initWithBytesNoCopy:(void *)bytes
length:(NSUInteger)length freeWhenDone:(BOOL)b;

//29.

- (instancetype)initWithBytesNoCopy:(void *)bytes
length:(NSUInteger)length deallocator:(void (^)(void *bytes,NSUInteger length))deallocator NS_AVAILABLE(10_9, 7_0);

//30.从参数path指定的文件读入二进制数据,用该数据初始化NSData对象。如果读取文件失败,则释放调用者并返回nil,同时把错误信息写入指针errorPtr。mask是一个选项信息,用于指定是否使用虚拟内存等。

- (instancetype)initWithContentsOfFile:(NSString *)path
options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

//31.从参数url指定的路径中读入,用该数据初始化NSData对象。如果读取文件失败,则释放调用者并返回nil,同时把错误信息写入指针errorPtr。mask是一个选项信息,用于指定是否使用虚拟内存等。

- (instancetype)initWithContentsOfURL:(NSURL *)url
options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

//32.加载flie文件路径

- (instancetype)initWithContentsOfFile:(NSString *)path;

//33.加载url

- (instancetype)initWithContentsOfURL:(NSURL *)url;

//34.用指定的NSData对象aData来创建一个新的NSData对象,参数可以是NSMutableData对象。

- (instancetype)initWithData:(NSData *)data;

//35.用指定的NSData对象aData来创建一个新的NSData对象,参数可以是NSMutableData对象。

+ (instancetype)dataWithData:(NSData *)data;

@end

/*** base64方案编码分类 
iOS7之后苹果给出以下四个API供实现base64方案
头两个是处理字符串的,后两个是处理UTF-8编码数据的,这两个承兑的方法功能是一样的,但是有时候用其中一个比另一个效率要高。如果你像要bae64编码字符串然后写进文件,你应该使用UTF-8编码数据的这对方法。如果你打算base64编码字符串之后用作json,你应该使用另外一对方法 编码解码一一对应***/

@interface NSData (NSDataBase64Encoding)

//36.解码。将已经base64编码之后的字符串数据再转化为NSData数据,

- (instancetype)initWithBase64EncodedString:(NSString *)base64String
options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9, 7_0);

//37.编码。将一个data数据利用base64方案转化成base64之后的NSString字符串

- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

//38.解码。将已经base64编码之后的NSData数据再转化为NSData数据

- (instancetype)initWithBase64EncodedData:(NSData *)base64Data
options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9, 7_0);

//39.编码.将一个data数据利用base64方案转化成base64之后的NSData数据

- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

示例程序:使用第一对编码解码API。

NSString * stringExample = [NSString stringWithFormat:@"I Love You"];

NSData * data1 = [stringExample dataUsingEncoding:NSUTF8StringEncoding];

NSString * base64String   = [data1 base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

NSLog(@"Base64-encoded string is %@",base64String);

//log(Base64-encoded
string is SSBMb3ZlIFlvdQ==);

NSData * dataFromString = [[NSData alloc]
initWithBase64EncodedString:base64String
options:NSDataBase64DecodingIgnoreUnknownCharacters];

NSLog(@"string is %@",[NSString stringWithUTF8String:[dataFromString bytes]]);

//log(string is I Love You);

@end

/****************
Mutable Data可变data****************/

@interface NSMutableData : NSData

//40.可变data的可变字节

@property (readonly) void *mutableBytes NS_RETURNS_INNER_POINTER;

//41.可变data的长度

@property NSUInteger length;

@end

@interface NSMutableData (NSExtendedMutableData)

//42.给可变data追加字节

- (void)appendBytes:(const void *)bytes
length:(NSUInteger)length;

//43.给data追加其他的data

- (void)appendData:(NSData *)other;

//44.为已经存在的data追加新的长度

- (void)increaseLengthBy:(NSUInteger)extraLength;

示例程序:

NSMutableData * data = [NSMutableData data];

[data increaseLengthBy:5];

NSLog(@"dataLength———%lu",(unsigned long)data.length);

//45.给data替换对应位置的字节

- (void)replaceBytesInRange:(NSRange)range
withBytes:(const void *)bytes;

//46.重置可变data对应位置的字节

- (void)resetBytesInRange:(NSRange)range;

//47.为可变data设置data数据

- (void)setData:(NSData *)data;

//48.给data替换对应位置的字节,
并且存在替换长度

- (void)replaceBytesInRange:(NSRange)range
withBytes:(const void *)replacementBytes
length:(NSUInteger)replacementLength;

@end0

@interface NSMutableData (NSMutableDataCreation)

//49.动态创建可变data 并且初始化指定大小

+ (instancetype)dataWithCapacity:(NSUInteger)aNumItems;

//50.动态创建可变data 并且初始化指定长度

+ (instancetype)dataWithLength:(NSUInteger)length;

//51.静态创建可变data 并且初始化指定大小

- (instancetype)initWithCapacity:(NSUInteger)capacity;

//52.静态创建可变data 并且初始化指定长度

- (instancetype)initWithLength:(NSUInteger)length;

@end

//1.data读取过程的可选配置条件

typedef NS_OPTIONS(NSUInteger,
NSDataReadingOptions) {

NSDataReadingMappedIfSafe =   1UL << 0, 
  NSDataReadingUncached = 1UL << 1,

NSDataReadingMappedAlways NS_ENUM_AVAILABLE(10_7, 5_0)
= 1UL << 3,

NSDataReadingMapped = NSDataReadingMappedIfSafe,//
Deprecated name for NSDataReadingMappedIfSafe

NSMappedRead = NSDataReadingMapped,//
Deprecated name for NSDataReadingMapped

NSUncachedRead = NSDataReadingUncached//
Deprecated name for NSDataReadingUncached

};

//2.data写入过程的可选配置条件

typedef NS_OPTIONS(NSUInteger,
NSDataWritingOptions) {

NSDataWritingAtomic = 1UL << 0,

NSDataWritingWithoutOverwriting NS_ENUM_AVAILABLE(10_8, 6_0)
= 1UL << 1,

NSDataWritingFileProtectionNoneNS_ENUM_AVAILABLE_IOS(4_0) 
                                = 0x10000000,

NSDataWritingFileProtectionCompleteNS_ENUM_AVAILABLE_IOS(4_0) 
                            =0x20000000,

NSDataWritingFileProtectionCompleteUnlessOpenNS_ENUM_AVAILABLE_IOS(5_0) 
                  = 0x30000000,

NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NS_ENUM_AVAILABLE_IOS(5_0) 
= 0x40000000,

NSDataWritingFileProtectionMaskNS_ENUM_AVAILABLE_IOS(4_0) 
                                = 0xf0000000,

NSAtomicWrite = NSDataWritingAtomic

};

/****************
Data Search Options****************/

//3.data在搜索过程中的可选配置条件

typedef NS_OPTIONS(NSUInteger,
NSDataSearchOptions) {

NSDataSearchBackwards = 1UL << 0,

NSDataSearchAnchored = 1UL << 1

} NS_ENUM_AVAILABLE(10_6, 4_0);

/*** 下方为已废弃代码,不多做解释 ***/

@interface NSData (NSDeprecated)

- (void)getBytes:(void *)buffer NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "This
method is unsafe because it could potentially cause buffer overruns. Use -getBytes:length: instead.");

+ (id)dataWithContentsOfMappedFile:(NSString *)pathNS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "Use
+dataWithContentsOfURL:options:error: and NSDataReadingMappedIfSafe or NSDataReadingMappedAlways instead.");

- (id)initWithContentsOfMappedFile:(NSString *)path NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "Use
-initWithContentsOfURL:options:error: and NSDataReadingMappedIfSafe or NSDataReadingMappedAlways instead.");

- (id)initWithBase64Encoding:(NSString *)base64StringNS_DEPRECATED(10_6, 10_9, 4_0, 7_0);

- (NSString *)base64Encoding NS_DEPRECATED(10_6, 10_9, 4_0, 7_0);

@end

/****************
    Purgeable Data****************/

NS_CLASS_AVAILABLE(10_6, 4_0)

@interface NSPurgeableData
: NSMutableData <NSDiscardableContent>
{

@private

NSUInteger _length;

int32_t _accessCount;

uint8_t _private[32];

void *_reserved;

}

@end

 

iOS NSData的更多相关文章

  1. iOS NSData简单解析

    iOS 基本数据类型之NSData 1 nsdata 作用: 用于存储二进制的数据类型 nadat类提供一种简单的方式,它用来设置缓存区.将文件的内容读入到缓存区.或者将缓存区中的内容写到一个文件. ...

  2. ios -- NSdata 与 NSString,Byte数组,UIImage 的相互转换(转)

    1. NSData 与 NSStringNSData-> NSStringNSString *aString = [[NSString alloc] initWithData:adata enc ...

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

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

  4. iOS的属性声明:retain和strong的区别

    声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在声明Block时,使用strong和retain会有截然不同的效果.strong会等于copy,而r ...

  5. iOS -OC调用js页面

    我们这边和h5商量好传递一个结构体参数过去,然后由于解析的问题,导致我这里传递的参数,到h5那边不执行那边的方法 -(void)loginCallBack { NSDictionary *dic; u ...

  6. iOS解决NSData转NSString后字符为空

    iOS中,将NSData转NSString的一般方法为[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];但是当dat ...

  7. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  8. iOS NSDictionary、NSData、JSON数据类型相互转换

    iOS经常需要用到数据类型的转换,下面列举一下常用类型的转换. 1.NSDictionary类型转换为NSData类型: //NSDictionary -> NSData: NSDictiona ...

  9. IOS的XML文件解析,利用了NSData和NSFileHandle

    如果需要了解关于文档对象模型和XML的介绍,参看 http://www.cnblogs.com/xinchrome/p/4890723.html 读取XML 上代码: NSFileHandle *fi ...

随机推荐

  1. Chapter7:类

    关于this指针 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象.当我们调用一个成员函数时,用请求该函数的对象初始化this. total.isbn(); //等价于编译器重写为 Sa ...

  2. qqq

    http://blog.sina.com.cn/s/blog_6f0774010100wawd.html http://www.2cto.com/kf/201302/189135.html http: ...

  3. junit4新框架hamcrest

    Hamcrest是一个书写匹配器对象时允许直接定义匹配规则的框架.有大量的匹配器是侵入式的,例如UI验证或者数据过滤,但是匹配对象在书写灵活的测试是最常用.本教程将告诉你如何使用Hamcrest进行单 ...

  4. Hadoop中的辅助类ToolRunner和Configured的用法详解

    在开始学习hadoop时,最痛苦的一件事就是难以理解所写程序的执行过程,让我们先来看这个实例,这个测试类ToolRunnerTest继承Configured的基础上实现了Tool接口,下面对其用到的基 ...

  5. 【调试】路由器设置不了静态IP -- clwu

    办公室的路由器是IP-COM,原来可以设置静态IP 的,但后来不知道为什么比较长一段时间内设置不了,原来设置的静态IP 也不见了.现象是这样 什么都没有. 今天的网络被网管重调整过了,需要重新设置静态 ...

  6. iOS tableview 优化总结

    根据网络上的优化方法进行了总括.并未仔细进行语言组织.正在这些优化方法进行学习,见另一篇文章 提高app流畅度 1.cell子控件创建写在 initWithStyle:reuseIdentifier ...

  7. xcode报错:Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/b

    今天使用xcode编译工程发现一个问题,这里记录一下防止忘记 xcode报错: Command /Applications/Xcode.app/Contents/Developer/Toolchain ...

  8. vim之pydiction插件

    [vim之pydiction插件] It consists of three main files: python_pydiction.vim -- Vim plugin. complete-dict ...

  9. tomcat的 JNDI 配置

    tomcat的conf/server.xml 配置 尽量用简单版 <Context path="/cas" docBase="D:\YC\zqV7\cas\WebR ...

  10. labview中的文件格式