學習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 *bytes NS_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 (^)(const void *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)options NS_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)options NS_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的長度 @propertyNSUInteger 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, NSDataWritingFileProtectionNone NS_ENUM_AVAILABLE_IOS(4_0) = 0x10000000, NSDataWritingFileProtectionComplete NS_ENUM_AVAILABLE_IOS(4_0) = 0x20000000, NSDataWritingFileProtectionCompleteUnlessOpen NS_ENUM_AVAILABLE_IOS(5_0) = 0x30000000, NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NS_ENUM_AVAILABLE_IOS(5_0) = 0x40000000, NSDataWritingFileProtectionMask NS_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 *)path NS_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 *)base64String NS_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