Objective-C 編譯期強制封裝(@private),但運行時提供 C API 繞過檢查。
object_getInstanceVariable#import <objc/runtime.h>
// 類定義
@interface Mobj : NSObject {
@private
NSString* mt_;
}
@end
@implementation Mobj
- (instancetype)init {
self = [super init];
if (self) mt_ = [[NSString alloc] initWithString:@"Ha Ha Ha"];
return self;
}
- (void)dealloc { [mt_ release]; [super dealloc]; }
@end
// 獲取私有變量
Mobj* obj = [[Mobj alloc] init];
NSString* str = nil;
object_getInstanceVariable(obj, "mt_", (void**)&str); // 關鍵調用
NSLog(@"%@", str); // 輸出: Ha Ha Ha
[obj release];
id obj:目標對象實例。const char* name:ivar 名稱(C 字符串,需與聲明一致,含下劃線)。void** outValue:輸出參數,接收 ivar 存儲的指針值(對象類型),或基本類型值(需強轉)。| 函數 | 用途 |
|---|---|
| class_getInstanceVariable | 從 Class 獲取 Ivar 結構體,再用 ivar_getOffset 計算偏移 |
| object_getIvar / object_setIvar | 直接按 Ivar* 讀寫,性能更高 |
| ivar_getName / ivar_getTypeEncoding | 獲取名稱/@encode 類型字符串 |