一、簡介
在使用第三方 SDK 的情況下,難免也需要在其基礎(chǔ)上做一些調(diào)整,有的時(shí)候需要修改其私有的屬性。這種情況應(yīng)該怎么處理呢?
一個(gè)場景模擬: 在一個(gè) SDK 中,有一個(gè) Class 是 HGObject,有一個(gè)私有屬性是 name。現(xiàn)在想要操作這個(gè) name。
二、具體的方案
具體的方案有兩種:
- 1、使用 KVC
- 2、使用分類
接下來分別介紹一下。
2.1 使用 KVC
這個(gè)方案,應(yīng)該是很多人使用的,代碼類似于這樣的:
{ // 通過 KVC 訪問私有屬性
HGObject* obj = [[HGObject alloc] init];
// KVC 設(shè)置值
[obj setValue:@"KVC_Value" forKey:@"name"];
// 通過 KVC 獲取值
NSString* value = [obj valueForKey:@"name"];
NSLog(@"通過 KVC 獲取的值是 : %@", value);
}
這種方式,在使用上很簡單,畢竟 KVC 是 OC 的固有特性。
2.2 使用分類
直接創(chuàng)建一個(gè)分類,然后重新再分類中申明一個(gè)同樣的屬性。然后在使用的時(shí)候與公開的屬性一致。代碼類似于這樣:
{ // 通過分類操作私有屬性
HGObject* obj = [[HGObject alloc] init];
obj.name = @"Category_Value";
NSLog(@"通過分類操作私有屬性 = %@", obj.name);
}
三、特別提醒
一旦由于 SDK 的升級在內(nèi)部將私有屬性刪除,那么兩種方案均會閃退。所以每次 SDK 升級之后一定要做好復(fù)查。為了避免閃退,每次調(diào)用都應(yīng)該使用 respondsToSelector: 。具體可以參考我的代碼:OC2Nature項(xiàng)目中 HGPrivate 目錄
有更多更好的方案, 歡迎討論!