欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS小技能之字典轉模及對象相等性示例詳解

 更新時間:2022年08月16日 10:14:58   作者:公眾號iOS逆向  
這篇文章主要為大家介紹了iOS小技能之字典轉模及對象相等性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

字典轉模型

/** 通常實現(xiàn)字典實例化模型,都實現(xiàn)了以下模型的實例化方法*/
//使用字典實例化模型
- (instancetype) initWithDictionary :(NSDictionary *) appDictionary;
//類方法可以快速實例化一個對象--把代碼放在它最應該呆的地方
+ (instancetype) appInfoWithDictionary : (NSDictionary *) appDictionary;
//返回plist文件對應的模型數(shù)組 ,使用懶加載

KVC的賦值

- (instancetype) initWithDictionary:(NSDictionary *)appDictionary{
    //self is object
    self = [super init];
    if (self) {//既然nil解析成NO,所以沒有必要在條件語句比較。不要拿某樣東西直接與YES比較,因為YES被定義為1
        //init local vars 將plist文件的信息在此處進行字典轉模型
        //KVC (key value coding) 鍵值編碼:是一種間接修改、讀取對象屬性的一種方法;KVC被稱為cocoa的大招
        [self setValuesForKeysWithDictionary:appDictionary];//本質上是調用        self setValue:<#(nullable id)#> forUndefinedKey:(nonnull NSString *)
    }
    return self;
}

I 字典轉模型

  • 使用字典的壞處

通常取出和修改數(shù)據(jù)字典的數(shù)據(jù),都要通過編寫“字符串類型”的key值-》編輯器IDE沒有智能提示、手動寫key容易寫錯,且此時IDE不會有任何的警告和報錯。 字典的使用例子

dict[@"name"] = @"Jack";
NSString *name = dict[@"name"];
  • 使用數(shù)據(jù)模型的好處

1)數(shù)據(jù)模型(專門用來存放數(shù)據(jù)的對象),使用數(shù)據(jù)模型表示數(shù)據(jù)更專業(yè)些

2)使用模型修改數(shù)據(jù)、讀取數(shù)據(jù)均采用對象的屬性,提高編寫效率

1.1 字典轉模型的實現(xiàn)步驟

1)字典轉模型的過程,通常被封裝在模型內部

2)模型應該提供一個“帶有NSDictionary類型”參數(shù)的構造方法

- (instancetype)initWithDict:(NSDictionary*)dict;
+ (instancetype)xxxWithDict:(NSDictionary*)dict;

1.2 字典轉模型的過程

  • [采用KVC(keyValueCoding)實現(xiàn)] plist文件解析-》字典數(shù)組(NSDictionary)-》模型數(shù)組(AppInfo)

使用字典實例化模型 (把代碼放在它最應該呆的地方)

- (instancetype) initWithDictionary:(NSDictionary *)appDictionary{
    //self is object
    self = [super init];
    if (self) {//既然nil解析成NO,所以沒有必要在條件語句比較。不要拿某樣東西直接與YES比較,因為YES被定義為1
        //init local vars 將plist文件的信息在此處進行字典轉模型
        //KVC (key value coding) 鍵值編碼:是一種間接修改、讀取對象屬性的一種方法;KVC被稱為cocoa的大招
        [self setValuesForKeysWithDictionary:appDictionary];     
    }
    return self;
}
//使用類方法實現(xiàn)“字典實例化模型”--地道的代碼
+ (instancetype) appInfoWithDictionary:(NSDictionary *)appDictionary{
    //self is class
    return [[self alloc]initWithDictionary:appDictionary];//+ (instancetype)alloc    Description    Returns a new instance of the receiving class.   
}
@end
  • 使用KVC的注意事項:

1、plist文件中的鍵值名稱必須與模型對象的屬性名稱一致

2、模型中的屬性,可以不全部出現(xiàn)在plist文件中

II 對象的相等性 & 本體性

一個對象的本體和它的內存地址是相關聯(lián)的。 NSObject 的isEqual:本質上是對本體性的檢查,即兩個 NSObject 如果指向了同一個內存地址,那它們就被認為是相同的。

當兩個物體有一系列相同的可觀測的屬性時,兩個物體可能是互相相等 。

2.1 相等性檢查

對象相等性檢查的主要應用場景:確定一個對象是不是一個集合的成員,對于 NSArray,NSDictionary 和 NSString 容器類來說,更加有用的是進行相等性檢查,即對于集合中的每個成員進行判斷,因此我們需要重寫isEqual: 。

重寫 isEqual:

  • 先進行本體性檢查,如果失敗,就進行實際內容(意義)上的比較,比如判斷其中幾個主要特性的屬性。
- (BOOL)isEqual:(id)object {
  if (self == object) {
    return YES;
  }
  if (![object isKindOfClass:[Person class]]) {
    return NO;
  }
  return [self isEqualToPerson:(Person *)object];//關鍵屬性的判斷,比如身份證ID
}
  • 重寫 hash 方法,便于快速地(O(1)) 進行元素查找。

相對于數(shù)組把元素按順序存儲(0, 1, ..., n-1),散列表在內存中分配 n 個位置,然后使用一個散列函數(shù)來計算出位置范圍之內的某個具體位置。

hash 得到的值不必是唯一可區(qū)分的,如果發(fā)生了散列碰撞,散列表會從碰撞產生的位置開始向后尋找,把新的元素放在第一個可供放置的位置。

@implementation NSDate (ex)
- (NSUInteger)hash {
  return (NSUInteger)abs([self timeIntervalSinceReferenceDate]);
}

對關鍵屬性的散列值進行一個簡單的二進制移位操作,即可簡單的實現(xiàn)對象的hash 函數(shù):

@implementation UIColor (ex)
/**
>左移運算符(<<):按二進制形式把所有的數(shù)字向左移動對應的位數(shù),高位移出(舍棄),低位的空位補零。
*/
- (NSUInteger)hash {
  CGFloat red, green, blue;
  [self getRed:&red green:&green blue:&blue alpha:nil];
  return ((NSUInteger)(red * 255) << 16) + ((NSUInteger)(green * 255) << 8) + (NSUInteger)(blue * 255);
}
@end

對關鍵屬性的散列值進行一個簡單的XOR操作

/**
異或 ^ 相同為0,不相同為1;
應用場景:密碼加密、散列值計算。
*/
- (NSUInteger)hash {
  return [self.id hash] ^ [self.birthday hash];
}

2.2 Foundation 框架中,自己實現(xiàn)的相等性檢查

NSAttributedString -isEqualToAttributedString:

NSData -isEqualToData:

NSDate -isEqualToDate:

NSDictionary -isEqualToDictionary:

NSHashTable -isEqualToHashTable:

NSIndexSet -isEqualToIndexSet:

NSNumber -isEqualToNumber:

NSOrderedSet -isEqualToOrderedSet:

NSSet -isEqualToSet:

NSString -isEqualToString:

NSTimeZone -isEqualToTimeZone:

NSValue -isEqualToValue:

2.3 字符串駐留

字符串駐留的優(yōu)化技術: 把一個不可變字符串對象的值拷貝給各個不同的指針。

Objective-C 選擇器的名字也是作為駐留字符串儲存在一個共享的字符串池當中的。

NSString *stra = @"Hello";
NSString *strb = @"Hello";
BOOL wt = (stra == strb); // YES

選擇器的比較

OBJC_EXPORT BOOL
class_respondsToSelector(Class _Nullable cls, SEL _Nonnull sel) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
- (BOOL)respondsToSelector:(SEL)aSelector;
if([device respondsToSelector:@selector(setSmoothAutoFocusEnabled:)]){
}

III 代碼重構(前提是已經實現(xiàn)了基本功能)

開發(fā)前:設定開發(fā)計劃、步驟 開發(fā)過程中:每一個步驟告一段落之后,我們要暫停,進行代碼審核,有針對性的重構(抽離重復代碼,模型和視圖各盡職責)

代碼重構的原則: 把代碼放在它最應該呆的地方

1、使用類方法實現(xiàn)字典實例化模型 (模型,通常是plist文件,網絡)

使用類方法實例化模型數(shù)組

//類方法可以快速實例化一個對象--把代碼放在它最應該呆的地方
+ (instancetype) appInfoWithDictionary : (NSDictionary *) appDictionary;
//返回plist文件對應的模型數(shù)組 ,使用懶加載
+ (NSArray *)appList;

2、使用類方法實例化視圖對象,并用數(shù)據(jù)模型裝配視圖內容

用類方法進行視圖的實例化

+ (instancetype) appView;//使用類方法加載xib
+ (instancetype) appViewWithAppInfo:(KNAppInfo *) appInfo;//使用類方法加載xib,參數(shù)用于視圖的數(shù)據(jù)裝配

see also

更多內容請關注 #小程序:iOS逆向,只為你呈現(xiàn)有價值的信息,專注于移動端技術研究領域;

以上就是iOS小技能之字典轉模及對象相等性示例詳解的詳細內容,更多關于iOS字典轉模對象相等性的資料請關注腳本之家其它相關文章!

相關文章

最新評論