iOS - OC NSData 數據


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM