前言
@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];