項目總結(jié)-9

方法的系統(tǒng)適配

  • 以日歷類為例:NSCalendar對象的創(chuàng)建有幾種方法,但是那些新的方法是支持高版本系統(tǒng)的,也就是說,在低版本系統(tǒng)中是沒有這些方法的,那么如果要滿足在不同的系統(tǒng)中調(diào)用不同的方法,需要做一個方法的適配,如下
NSCalendar *calendar = nil;
    if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) {
        calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    } else {
        calendar = [NSCalendar currentCalendar];
    }

respondsToSelector和instancesRespondToSelector

respondsToSelector:方法的作用:判斷左邊對象能否調(diào)用右邊的方法
instancesRespondToSelector:方法的作用:判斷左邊類的實例對象能否調(diào)用右邊的方法

[@"jack" respondsToSelector:@selector(length)] // 判斷是否有-length這個對象方法
     [@"jack" length]
     
[NSString respondsToSelector:@selector(length)] // 判斷是否有+length這個類方法
     [NSString length]
     
[NSString instancesRespondToSelector:@selector(length)] // 判斷是否有-length這個對象方法
     [@"" length]

比較系統(tǒng)版本

//獲取當(dāng)前系統(tǒng)的版本
NSString *version = [UIDevice currentDevice].systemVersion;

/*
 NSOrderedAscending 升序(右邊 > 左邊)
 NSOrderedSame 相等、相同
 NSOrderedDescending 降序(右邊 < 左邊)
*/

//方式一
if ([version compare:@"8.0"] != NSOrderedAscending) { // iOS系統(tǒng)版本 >= 8.0
    }

//方式二
if (version.doubleValue >= 8.0) { // iOS系統(tǒng)版本 >= 8.0
    
}

//比較Foundation框架的版本號
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_8_0) { // iOS系統(tǒng)版本 >= 8.0
        
    }

//其他一
if ([@"" respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) { // iOS系統(tǒng)版本 >= 7.0
        
    }
//其他二
if (NSClassFromString(@"UIAlertController")) { // iOS系統(tǒng)版本 >= 8.0
        
    }

"==" "isEqualToString" "isEqual"的區(qū)別

  • "=="是比較兩個對象的內(nèi)存地址

  • "isEqualToString"計較的是兩個字符串的內(nèi)容

  • "isEqual"默認(rèn)情況下是比較兩個對象的內(nèi)存地址,但是有一些系統(tǒng)自帶的類(比如Foundation中的NSString)重寫了這個方法,改變了這個方法的判斷規(guī)則(一般改為比較兩個對象的內(nèi)容,不是內(nèi)存地址)

  • Foundation中的一般規(guī)則:如果系統(tǒng)中的某個類重寫了isEqual這個方法改變其判斷規(guī)則,那么這個類會提供一個isEqualToXXX方法用來提示開發(fā)者isEqual被重寫過了,例如: NSString中重寫了isEqual,將這個方法的判斷規(guī)則由判斷兩個對象的內(nèi)存地址改為比較兩個對象的內(nèi)容,并且提供一個isEqualToString方法


    NSString *string1 = @"jack";
    NSString *string2 = [NSString stringWithFormat:@"jack"];
    
    NSLog(@"string1 == string2 -> %zd", string1 == string2); // 0
    NSLog(@"[string1 isEqualToString:string2] -> %zd", [string1 isEqualToString:string2]); // 1
    NSLog(@"[string1 isEqual:string2] -> %zd", [string1 isEqual:string2]); // 1


    NSString *string1 = @"jack";
    NSString *string2 = @"jack";
    
    NSLog(@"%p %p", string1, string2);
    NSLog(@"string1 == string2 -> %zd", string1 == string2); // 1
    NSLog(@"[string1 isEqualToString:string2] -> %zd", [string1 isEqualToString:string2]); // 1
    NSLog(@"[string1 isEqual:string2] -> %zd", [string1 isEqual:string2]); // 1

重寫自定義類的isEqual方法(以Person類為例)

/*
 一旦重寫了isEqual:方法顶籽,最好重寫hash方法凤藏,而且要遵守以下原則:
 1.isEqual:返回YES的2個對象,hash值一定要一樣
 2.hash值一樣的2個對象,isEqual:返回不一定是YES
 */
- (NSUInteger)hash
{
    return self.age + self.no + self.name.hash ;
}

- (BOOL)isEqual:(XMGPerson *)object
{
    return [self isEqualToPerson:object];
}

- (BOOL)isEqualToPerson:(XMGPerson *)person
{
    // 如果是完全相同的對象抚官,就省去后面的判斷
    if (self == person) return YES;
    
    // 如果object的類型不對猜旬,就不需要比較
    if (![person isKindOfClass:self.class]) return NO;
    
    // 基本數(shù)據(jù)類型
    BOOL result = (self.age == person.age && self.no == person.no);
    if (result == NO) return result;
    
    // 對象類型
    if (self.name || person.name) {
        if (![self.name isEqual:person.name]) return NO;
    }
    
    if (self.car || person.car) {
        if (![self.car isEqual:person.car]) return NO;
    }
    
    return YES;
}


XMGPerson *p1 = [[XMGPerson alloc] init];
    p1.age = 20;
    p1.no = 30;
    
    NSString *string1 = [NSString stringWithFormat:@"222"];
    NSString *string2 = @"222";
    
    NSArray *array = @[@"111", @"333", string2, string1];
    
    NSLog(@"%zd", [array containsObject:p1]); 
    NSLog(@"%zd", [array indexOfObject:string1]);

[array containsObject:]和[array indexOfObject:]的底層實現(xiàn)思路

- (BOOL)containsObject:(id)anObject
{
    if (anObject == nil) return NO;
    
    for (id obj in self) {
        if ([anObject isEqual:obj]) return YES;
    }
    
    return NO;
}

- (NSUInteger)indexOfObject:(id)anObject
{
    if (anObject == nil) return NSNotFound;
    
    NSUInteger index = 0;
    for (id obj in self) {
        if ([anObject isEqual:obj]) return index;
        index++;
    }
    
    return NSNotFound;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甩卓,隨后出現(xiàn)的幾起案子鸠匀,更是在濱河造成了極大的恐慌,老刑警劉巖逾柿,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缀棍,死亡現(xiàn)場離奇詭異机错,居然都是意外死亡爬范,警方通過查閱死者的電腦和手機(jī)弱匪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧诫,“玉大人,你說我怎么就攤上這事财搁。” “怎么了尖奔?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長提茁。 經(jīng)常有香客問我,道長茴扁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮毁习,結(jié)果婚禮上智嚷,老公的妹妹穿的比我還像新娘。我一直安慰自己纺且,他們只是感情好盏道,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著载碌,像睡著了一般猜嘱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫁艇,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天朗伶,我揣著相機(jī)與錄音,去河邊找鬼步咪。 笑死论皆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歧斟。 我是一名探鬼主播纯丸,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼静袖!你這毒婦竟也來了觉鼻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤队橙,失蹤者是張志新(化名)和其女友劉穎坠陈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捐康,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡仇矾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了解总。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮匕。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖花枫,靈堂內(nèi)的尸體忽然破棺而出刻盐,到底是詐尸還是另有隱情,我是刑警寧澤劳翰,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布敦锌,位于F島的核電站,受9級特大地震影響佳簸,放射性物質(zhì)發(fā)生泄漏乙墙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望听想。 院中可真熱鬧腥刹,春花似錦、人聲如沸哗魂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽录别。三九已至,卻和暖如春邻吞,著一層夾襖步出監(jiān)牢的瞬間组题,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工崔列, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赵讯,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓边翼,卻偏偏與公主長得像鸣剪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子债鸡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容