首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Objective-C 進階:NSValue 包裝結構體與 NSNull 表示空對象

     編輯:關於C++

繼 NSNumber 之後,NSValue 是另一個重要的包裝類,它能封裝任意 C/C++ 類型,包括結構體、指針、類對象等。而 NSNull 則用於在集合中表示「空值」(區別於 nil)。本文詳細介紹兩者的用法與區別。

NSValue:通用類型包裝器

核心概念

  • NSNumber 僅限標量數值類型。
  • NSValue 可包裝任意大小、任意類型的數據:結構體、矩陣、指針、類、選擇器等。
  • 底層實現:複製內存字節到內部緩衝區。

基本用法:包裝結構體

NSRange range = {1, 5}; // C 結構體

// 包裝:需指定類型編碼
NSValue *value = [NSValue value:&range withObjCType:@encode(NSRange)];

// 解包:需提供同類型變量接收
NSRange newRange;
[value getValue:&newRange];

// 輸出驗證
NSLog(@"%@", NSStringFromRange(newRange)); // 輸出 {1, 5}

關鍵點:@encode() 編碼字符串

@encode(類型) 編譯器生成類型的內部編碼字符串,NSValue 用它確定內存佈局。常見編碼:

類型@encode 結果示例
inti
floatf
NSRange{NSRange=ii}
CGRect{CGRect={CGPoint=dd}{CGSize=dd}}
指針^v
Class#
SEL:

便利構造器(常見結構體)

Foundation 為常用幾何結構體提供專用方法:

NSValue *pointVal = [NSValue valueWithCGPoint:CGPointMake(10, 20)];
NSValue *sizeVal = [NSValue valueWithCGSize:CGSizeMake(100, 50)];
NSValue *rectVal = [NSValue valueWithCGRect:CGRectMake(0, 0, 100, 100)];
NSValue *edgeVal = [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
NSValue *transVal = [NSValue valueWithCATransform3D:transform];

NSNull:集合中的佔位符

為什麼需要 NSNull?

  • Objective-C 集合(NSArray、NSDictionary)不能存儲 nil。
  • 但業務邏輯常需表示「無值」或「缺失」。
  • NSNull 是單例類,專門作為「空值佔位符」存入集合。

使用示例

NSNull *null = [NSNull null]; // 單例,無需 alloc/init

NSArray *arr = @[@"1", @"2", null, @"3"];
NSLog(@"arr = %@", arr); // 包含  佔位符

// 判斷是否為空值
if ([arr[2] isKindOfClass:[NSNull class]]) {
    NSLog(@"第3個元素是空值佔位符");
}

// JSON 解析常見場景
NSDictionary *json = @{@"name": @"Tom", @"age": [NSNull null]};
// age 字段存在但值為 null,區別於字段缺失

NSNumber vs NSValue vs NSNull 對比

類用途可存類型是否單例
NSNumber包裝數值標量int, float, BOOL 等否
NSValue包裝任意類型結構體、指針、類等任意否
NSNull表示集合中的空值無(單例本身即語義)是

總結

  • NSValue:當需要將非對象類型(結構體、指針等)存入集合或跨 API 傳遞時使用。記住 value:withObjCType: 和 getValue: 配對調用。
  • NSNull:集合中表示「有值但為空」的標準方式。JSON 解析、可選字段存儲常見。
  • 兩者均為不可變對象,線程安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved