国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Foundation框架解析

Original 2017-01-11 11:36:07 1844
abstract:字符串(NSString與NSMutableString)創(chuàng)建字符串int main(int argh, char * argv[]) {     @autoreleasepool     {      &nb

字符串(NSString與NSMutableString)

創(chuàng)建字符串

int main(int argh, char * argv[])
{
    @autoreleasepool
    {        //定義unichar數(shù)組,該數(shù)組是個(gè)基本類型,就是unsigned short的別名
        unichar data[6] = {1, 2, 3, 4, 5, 6};        //使用Unicode數(shù)值數(shù)組初始化字符串
        NSString* str = [[NSString alloc] initWithCharacters:data length:6];        NSLog(@"%@", str);        char* caster = "Heloo, IOS!";        //將c風(fēng)格字符串轉(zhuǎn)化為NSString對(duì)象
        NSString* str2 = [NSString stringWithUTF8String:cstr];        NSLog(@"%@", str2);        //將字符串寫入制定文件
        [str2 writeToFile:@"myFile.txt" 
        atomically:YES 
        encoding:NSUTF8StringEncoding
        error:nil];        //讀取文件內(nèi)容,用文件內(nèi)容初始化字符串
        NSString* str3 = [NSString stringWithContentsOfFile:@"Test.m"
        encoding:NSUTF8Encoding
        error:nil];        NSLog(@"%@", str3);
    }
}


NSString的常用功能

#import <Foundation/Foundation.h>int main(int argh, char * argv[])
{
    @autoreleasepool
    {        NSString* str = @"Hello";        NSString* book = @"《西游記》";        //在str后面追加固定字符串,該方法未改變?cè)址畬?duì)象,只是將新生成的字符串重新賦值給了str指針變量
        str = [str stringByAppendingString:@",IOS!"];        NSLog(@"%@", str);        //獲取字符串對(duì)應(yīng)的C風(fēng)格字符串
        const char* cstr = [str UTFString];        NSLog(@"獲取的C字符串:%s", caster);        //在str后面追加呆變量的字符串
        str = [str stringBtAppendingFormat:@"%@很好看!", book];        NSLog(@"%@", str);        NSLog(@"str的字符格式為:%lu", [str length]);        NSLog(@"str按UTF8字符集解碼后的字節(jié)數(shù)為:%lu", [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);        //獲取str前是個(gè)字符組成的字符串
        NSString* s1 = [str substringToIndex:10];        NSLog(@"%@", s1);        //獲取str從第5個(gè)字符開始與后面字符組成的字符串
        NSString* s2 = [str substringFromIndex:5];        NSLog(@"%@", s2);        //獲取從第5到第15個(gè)字符組成的字符串
        NSString* s3 = [str substringWithRang:NSMakeRang(5, 15)];        NSLog(@"%@", s3);        //獲取 IOS 在 str 中出現(xiàn)的位置
        NSRange pos = [str rangeOfString:@"IOS"];        NSLog(@"IOS 在 str 中出現(xiàn)的開始位置是:%ld ,長(zhǎng)度為:%ld", pos.location, pos.length);        //將 str 中的字符轉(zhuǎn)為大寫
        str = [str uppercaseString];        NSLog(@"%@", str);
    }
}


可變字符串(NSMutableString)

NSString對(duì)象的字符序列是不可更改的,直至對(duì)象被銷毀,與NSString對(duì)象不同的是,NSMutableString對(duì)象則代表一個(gè)字符序列可變的字符串,而且NSMutableString是NSString得子類,這代表NSString的所有方法,NSMutableString也是可用的。

#import <Foundation/Foundation.h>int main(int argh, char * argv[])
{
    @autoreleasepool
    {
        NSString* book = @"《西游記》";        //創(chuàng)建一個(gè) NSMutableString 對(duì)象
        NSMutableString* str = [NSMutableString stringWithString:@"Hello"]; 
        //追加固定字符串,由于是字符串包含的字符序列發(fā)生了改變,因此無需重新賦值
        [str appendString:@",IOS!"];
        NSLog(@"%@", str);        //追加呆變量的字符串
        [str appendFormat:@"%@很好看!", book];
        NSLog(@"%@", str);        //在指定位置插入字符串
        [str INSERTString:@"MyInsert" aIndex:6];
        NSLog(@"%@", str);        //刪除從位置6到位置12的字符
        [str DELETECharactersInRange:NSRange(6, 12)];
        NSLog(@"%@", str);        //將從位置6到位置9的字符替換成MyReplace
        [str replaceCharatersInRange:NSRange(6, 9) withString:@"MyReplace"];
        NSLog(@"%@", str);
    }
}


時(shí)間與日期

日期與時(shí)間(NSDate)

#import <Foundation/Foundation.h>int main(int argh, char * argv[])
{
    @autoreleasepool
    {        //獲取當(dāng)前日期、時(shí)間的NSDate
        NSDate* date1 = [NSDate date];        NSLog(@"%@", date1);        //獲取從當(dāng)前時(shí)間開始一天后的日期、時(shí)間
        NSDate* date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:3600*24];        NSLog(@"%@", date2);        //獲取從當(dāng)前時(shí)間開始三天之前的日期、時(shí)間
        NSDate* date3 = [[NSDate alloc] 
        initWithTimeIntervalSinceNow:-3*3600*24];        NSLog(@"%@", date3);        //獲全國(guó)1970年1月1日開始,20年之后的日期、時(shí)間
        NSDate* date4 = [NSDate dateWithTimeIntervalSince1970:3600*24*366*20];        NSLog(@"%@", date4);        //獲取系統(tǒng)當(dāng)前的Locale
        NSLocale* cn = [NSLocale currentLocale];        //獲取 NSDate 在當(dāng)前 Locale 下對(duì)應(yīng)的字符串
        NSLog(@“%@”, [date1 descrptionWithLocale:cn]);        //獲取兩個(gè)日期之間較早的日期
        NSDate* earlier = [date1 earlierDate:date2];        //獲取兩個(gè)日期之間較晚的日期
        NSDate* later = [date1 laterDate:date2];        /*用 compare: 方法比較兩個(gè)日期并返回 NSComparisonResult 枚舉值
        枚舉值包含 NSOrderedAscending NSOrderedSame NSOrderedDescending 三個(gè)值
        分別代表調(diào)用者在參數(shù)值之前、相同、之后
        */
        switch([date1 compare:date3])
        {            case NSOrderedAscending:                 NSLog(@"date1位于date3之前");                 break;            case NSOrderedSame:                 NSLog(@"date1與date3相同");                 break;            case NSOrderedDescending:                 NSLog(@"date1位于date3之后");                 break;
        }        //獲取兩個(gè)時(shí)間之間的時(shí)間差,秒級(jí)別
        NSLog(@"date1與date3之間的時(shí)間差%g秒", 
        [date1 timeIntervalSinceDate:date3]);        //獲取制定時(shí)間與現(xiàn)在時(shí)間的差,秒級(jí)別
        NSLog(@"date2與現(xiàn)在時(shí)間差%g秒", 
        [date2 timeIntervalSinceNow]);
    }
}

日期格式器(NSDateFormatter)

NSDateFormatter用于完成NSDate與NSString之間的轉(zhuǎn)換。

NSDateFormatterNoStyle: 不顯示日期、時(shí)間的風(fēng)格

NSDateFormatterShortStyle: 顯示短的日期、時(shí)間風(fēng)格 
90-1-1 上午8:00

NSDateFormatterMediumStyle: 顯示中等的日期、時(shí)間風(fēng)格 
1990-1-16

NSDateFormatterLongStyle: 顯示腸的日期、時(shí)間風(fēng)格 
1990年1月16日 GMT+0800 上午8時(shí)00分00秒

NSDateFormatterFullStyle: 顯示完整的日期、時(shí)間風(fēng)格 
1990年1月16日 星期二 中國(guó)標(biāo)準(zhǔn)時(shí)間 上午 8時(shí)00分00秒

#import <Foundation/Foundationh>int main(int argh, char * arhv[])
{
    @autoreleasepool
    {        //創(chuàng)建NSDate對(duì)象
        NSDate* dt = [NSDate date];        //創(chuàng)建NSLocale
        NSLocale* locale = [[NSLocale alloc] 
        nitWithLocaleIdentifier:@"zh_CN"];        //創(chuàng)建NSDateFormatter對(duì)象
        NSDateFormar* df = [[NSDateFormatter alloc] init];        //設(shè)置 NSDateFormater的日期、時(shí)間風(fēng)格
        [df setDateStyle:NSDateFormatterShortStyle];
        [df setTimeStyle:NSDateFormatterShortStyle];        //設(shè)置NSDateFormatter的NSLocale
        [df setLocale:locale];        //以df的格式輸出dt的日期值
        NSLog(@"以 df 的格式輸出 dt 的日期值為:%@", [df stringFromDate:dt]);        //創(chuàng)建DateFormaer對(duì)象,并設(shè)置自定義的格式器模板
        NSDateFormatter* df2 = [[NSDateFoarmter alloc] init];
        [df2 setDateFormat:@"公元yyyy年MM月DD日HH時(shí)mm分"];        //以 df2 的自定義格式輸出 dt 的日期值
        NSLog(@"以 df2 的自定義格式輸出 dt 的日期值為:%@", [df2 tringFromDate:dt]);        //創(chuàng)建日期字符串
        NSString* dateStr = @"2016-03-02";
        NSDateFormatter* df3 = [[NSDateFormatter alloc] init];        //依據(jù)字符串的格式設(shè)置格式模板
        [df3 setDateFormat:@"yyyy-MM-DD"];        //將字符串轉(zhuǎn)化為NSDate對(duì)象
        NSDate* date2 = [df3 dateFromString:dateStr];        NSLog(@"%@", date2);
    }
}

日歷(NSCalendar)與日期組件(NSDateComponents)

NSDateComponents可以將個(gè)時(shí)間字段分別設(shè)置、獲取,NSDate則是將各時(shí)間字段整合為一個(gè)整體,NSCalendar主要用于實(shí)現(xiàn)兩者之間的轉(zhuǎn)換,主要用以下兩個(gè)方法來實(shí)現(xiàn):

(NSDateComponents*)components:fromDate: 從NSDate對(duì)象提取年月日時(shí)分秒個(gè)時(shí)間字段信息

dateFromComponents:(NSDateComponents*) comps: 使用comps對(duì)象包含的年月日時(shí)分秒個(gè)時(shí)間字段信息來創(chuàng)建NSDate

#import <Foundation/Foundation.h>int main(int argh, char* argv[])
{
    @autoreleasepool
    {        //獲取代表公歷的Calendar對(duì)象
        NSCalendar *gregorian = [[NSCalendar alloc] 
        initWithCalendarIdentifier:NSGregorianCalendar];        //獲取當(dāng)前日期
        NSDate* dt = [NSDate date];        //定義一時(shí)間字段的企標(biāo),指定將會(huì)獲取的年月日時(shí)分秒信息
        unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | 
        NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | 
        NSSecondCalendar | NSWeekdayCalendarUnit;        //獲取不同時(shí)間字段信息
        NSDateComponents* comp = [gregorian components:unnitFlags fromDate:dt];        //輸出各時(shí)間字段
        NSLog(@"現(xiàn)在時(shí)%ld年%ld月%ld日%ld時(shí)%ld分%ld秒%ld星期", comp.year, 
        comp.month, comp.day, comp.hour, comp.minute, comp.second, 
        comp.weekday);        //再次創(chuàng)建NSDateComponents對(duì)象
        NSDateComponents* co2 = [[NSDateComponents alloc] init];        //設(shè)置各時(shí)間字段
        comp2.year = 2016;
        comp2.month = 4;
        comp2.day = 5
        comp2.hour = 18;
        comp2.minute = 34;        //用 NSDateCompontents 來初始化 NSDate 對(duì)象
        NSDate* dt2 =[gregorian dateFromCompontents:comp2];        NSLog(@"%@", dt2);
    }
}

定時(shí)器(NSTimer)

創(chuàng)建NSTimer對(duì)象用可用以下兩種方法:

scheduledTimerWithTimeInterval:invocation:repeats:

scheduleTimerWithTimeInterval:target:SELECTor:userInfo:repeat:

參數(shù)作用

timeInterval::指定每隔多少秒執(zhí)行一次任務(wù)

invocation或 target &SELECTor:指定重復(fù)執(zhí)行的任務(wù)。

userInfo:額外的附加信息

repeat:指定一個(gè)BOOL值,控制是否需要重復(fù)執(zhí)行任務(wù)

//啟動(dòng)一個(gè)定時(shí)器[NSTimer scheduleTimerWithTimeInterval:0.5target:self //指定以當(dāng)前對(duì)象的 info: 方法作為執(zhí)行任務(wù)SELECTor:@SELECTor(info:)
userInfo:nilrepeat:YES];    //指定重復(fù)執(zhí)行

上面代碼中指定以當(dāng)前對(duì)象的 info: 方法作為任務(wù)執(zhí)行體,因此,程序還需要在該類中定義一個(gè) info: 方法,該方法可定義一個(gè) NSTimer 參數(shù),該參數(shù)代表調(diào)度該任務(wù)的定時(shí)器。 
增加的 info: 方法代碼如下:

- (void) info:(NSTimer*) timer
{    NSLog(@"正在執(zhí)行第%d此任務(wù)", self.count++);    //如果count值大于10,取消定時(shí)器,count為類的一個(gè)自定義屬性
    if(self.count > 10)
    {        NSLog(@"取消執(zhí)行定時(shí)器");
        [timer invalidate];
    }
}

對(duì)象復(fù)制

copy方法返回對(duì)象的 不可修改的副本,mutableCopy方法返回對(duì)象的可修改副本

自定義類的對(duì)象,為了保證可以調(diào)用copy方法和mutableCopy方法,通常需要:

讓該類實(shí)現(xiàn)NSCopying協(xié)議和copyWithZone方法

讓該類實(shí)現(xiàn)NSMutableCopying協(xié)議和mutableCopyWithZone方法

copyWithZone方法重寫類似于下:

- (id) copyWithZone:(NSZone*) zone
{    NSLog(@"--執(zhí)行copyWithZone--");    /*
    使用zone參數(shù)創(chuàng)建MyDog對(duì)象,若父類已實(shí)現(xiàn)了NSCopying協(xié)議,并且重寫過copyWithZone:方法,那么子類重寫copyWithZone:方法應(yīng)該先調(diào)用父類的copy方法復(fù)制從父類繼承得到的成員變量,然后再對(duì)子類中定義的成員變量進(jìn)行賦值,如 MyDog* dog = [super copy];
    */
    MyDog* dog = [[[self class] alloc WithZone:zone] init];    //將源對(duì)象的name實(shí)例復(fù)制一個(gè)副本后賦值給新對(duì)象,這樣就能實(shí)現(xiàn)深賦值
    dog.name = [self.name mutableCopy];
    dog.age = self.age;    return dog;
}

數(shù)組(NSArray與NSMutableArray)

NSArray代表一個(gè)有序可重復(fù)的集合,每個(gè)元素都有對(duì)應(yīng)的順序索引,但不可修改,NSMutableArray與NSArray的區(qū)別在于它使可修改的。

創(chuàng)建NSArray的方法:

array 創(chuàng)建一個(gè)不包含任何元素的空NSArray

arrayWithContentsOfFile:/initWithContentsOfFile: 讀取文件內(nèi)容來創(chuàng)建NSArray

arrayWithPbject:/initWithObject: 創(chuàng)建包含指定元素的NSArray

arrayWithObjects:/initWithObjects: 創(chuàng)建指定N個(gè)元素的NSArray

下例示范了NSArray的方法:

#Import <Foundation/Foundation.h>int main(int argh, char * argv[])
{
    @autoreleasepool
    {
        NSArry* array = [NSArray arrayWithObjects:
        @"孫悟空", @"豬八戒", @"沙和尚", @"白龍馬", @"小龍女", nil];        NSLog(@"第一個(gè)元素:%@", [array objectAtIndex:0]);        NSLog(@"索引為1的元素:%@", [array objectAtIndex:1]);        NSLog(@"最后一個(gè)元素:%@", [array lastObject]);        //獲取索引2-5的元素組成新的集合
        NSArray* arr1 = [array objectAtIndexes:
        [NSIndexSet indexSetWithIndexesInRange(2, 3)]];        NSLog(@"%@", arr1);        //獲取元素在集合中的位置
        NSLog(@"豬八戒的位置:%ld", [array indexOfObject:@"豬八戒"]);        //獲取元素在集合指定范圍中的位置
        NSLog(@"在3-5范圍中豬八戒的位置:%ld", [array indexOfObject:@"豬八戒" 
        inRang:NSMakeRange(3, 5)]);        //向數(shù)組后追加一個(gè)元素,不是修改原對(duì)象,而是新建對(duì)象再賦值
        array = [array arrayByAddingObject:@"唐僧"];        //想數(shù)組后追加另一個(gè)數(shù)組所有元素
        array = [array arrayByAddingObjectsFromArray:
        [NSArray arrayWithObjects:@"如來", @"玉帝", nil]];        for(int i = 0; i < array.count; i++)
        {            NSLog(@"%@", [array objectAtIndex:i]);            /*上面代碼也可簡(jiǎn)寫成:
            NSLog(@"%@", array[i]);   */
        }        //獲取array中索引3-5
        NSArray* arr2 = [array subarrayWithRange:NSMakeRange(3, 5)];        //將數(shù)組寫入文件
        [arr2 writeToFile:@"myFile.txt" atomically:YES];
    }
}

NSArray方法

集合所有元素調(diào)用方法:

makeObjectsPerformSelector: 集合每個(gè)元素依次調(diào)用指定方法

makeObjectsPerformSelector:withObject: 集合每個(gè)元素?cái)y帶參數(shù)依次調(diào)用指定方法

集合元素進(jìn)行隱式遍歷,并依次執(zhí)行一段代碼塊:

enumerateObjectsUsingBlock:

enumerateObjectsWithOptions:usingBlock:

enumreateObjectsAtIndexes:options:usingBlock:

#import <Foundation/Foundation.h>int main(int argh, char * argv[])
{
    @autoreleasepool
    {
        NSArry* array = [NSArray arrayWithObjects:
        [[MyUser alloc] initWithName:@"sun" pass:"123"], 
        [[MyUser alloc] initWithName:@"bai" pass:@"345"], 
        [[MyUser alloc] initWithName:@"zhu" pass:@"654"], 
        [[MyUser alloc] initWithName:@"tang" pass:@"178"], 
        [[MyUser alloc] initWithName:@"niu" pass:@"155"], 
        nil];        //對(duì)集合元素整體調(diào)用方法
        [array makeObjectsPerformSelector:@seletor(say:) 
        withObject:@"Hello,World!"];        //集合內(nèi)指定范圍元素來執(zhí)行代碼塊
        [array  enumerateObjectsAtIndexes:
        [NSIndexSet indexSetWithIndexesInRange:NSMakeRange()2, 3] 
        options:NSEnumreationReverse
        usingBlock: ^(id obj, NSUInteger idx, BOOL *stop)
        {            NSLog(@"正在處理第%ld個(gè)元素:%@", idx, obj);
            [obj say:@"執(zhí)行代碼塊"];
        }]
    }
}

對(duì)NSArray進(jìn)那個(gè)排序

sortedArrayUsingFunction:context: 用排序函數(shù)進(jìn)行排序,函數(shù)必須返回NSOrderedDescending、NSOderedAscending、NSOrderedSame這些枚舉值,返回一個(gè)排好序的NSArray對(duì)象

sortedArrayUsingSlector:用自身方法進(jìn)行排序,方法必須返回NSOrderedDescending、NSOderedAscending、NSOrderedSame這些枚舉值,返回一個(gè)排好序的NSArray對(duì)象

sortedArrayUsingComparator:用代碼塊進(jìn)行排序,代碼塊必須返回NSOrderedDescending、NSOderedAscending、NSOrderedSame這些枚舉值,返回一個(gè)排好序的NSArray對(duì)象

使用枚舉器(NSEnumerator)遍歷NSArray集合

用NSArray以下兩方法來返回枚舉器(NSEnumerator):

objectEnumerator 返回NSArray集合的順序枚舉器

reverseObjectEnumerator 返回NSArray集合的逆序枚舉器

枚舉器(NSEnumerator)包含如下兩方法:

allObjects

nextobjext 
一般借助 nextObject 方法即可對(duì)元素集合進(jìn)行枚舉,采用循環(huán)不斷獲取 nextObject 方法的返回值,知道該方法的返回值為nil結(jié)束循環(huán)

NSEnumerator* en [array objectEnumerator];
id object;while(object = [en nextObject]){
    NSLog(@"%@", object);
}

快速枚舉(for(… in …))

NSMutableArray為NSArray的一個(gè)子集,比NSArray多出了對(duì)元素進(jìn)行操作(添加、刪除、替換、排序)的方法:

[array add object:@"觀音"];
[array addObjectsFromArray:arr1];
[array INSERTObject:@"燃燈" atIndex:2];
[array INSERTObjects:[NSArray arrayWithObjects:@"伏虎", @"降龍", nil] atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3, 2)]];
[array removeLastObject];
[array removeObjectAtIndex:5];
[array removeObjectsInRange:NSMakeRange(3, 2)];
[array replaceObjectAtIndex:2 withObject:@"太白"];

NSArray的KVC與KVO

setValue:forKey: 將NSArray中所有元素指定key的屬性設(shè)置為value

valueForKey: 返回NSArray所有元素指定key的屬性組成的NSArray

addObserver:forKeyPath:options:context: 為NSArray所有元素添加KVO監(jiān)聽器

removeObserver:forKeyPath: 刪除NSArray所有元素的KVO監(jiān)聽器

addObserver:toObjectsAtIndexes:forKeyPath:options:context: 為NSArray指定范圍的元素添加KVO監(jiān)聽器

removeObserver:fromObjectsAtIndexes:forKeyPath: 刪除NSArray指定范圍元素的KVO監(jiān)聽器

集合(NSSet和NSMutableSet)

與NSArray相似點(diǎn):

通過count方法獲取元素?cái)?shù)量

快速枚舉

通過objectEnmuerator方法來獲取枚舉器,病用枚舉器遍歷集合

makeObjectsPerformSelector:、makeObjectsPerformSelector:withObject:

enumerateObjectsUsingBlock:、enumerateObjectsWithOptions:UseingBlock:

KVC和KVO

之外的方法:

setByAddingObject: 向集合追加一個(gè)新元素,并返回新集合

setByAddingObjectsFromSet: 向集合追加多個(gè)新元素,并返回新集合

setByAddingObjectsFromArray: 向集合追加NSArray集合中的所有元素,并返回新集合

allObjects: 返回集合中所有元素組成的NSArray

anyObject: 返回集合中非隨機(jī)某個(gè)元素

containObject: 判斷是否包含指定元素 BOOL

member:判斷該集合是否包含與該參數(shù)相等的元素,包含則返回元素,不包含則返回nil

objectsPassingTest: 需要傳入一個(gè)代碼塊對(duì)集合過濾,保留滿足條件(return BOOL值為YES)的元素組成新的NSSet并返回

objectsWithOptions:passingTest:與前一個(gè)方法相似,多一個(gè)可傳入NSEnumerationOptions參數(shù)

isSubsetOfSet:判斷當(dāng)前集合是否為另一個(gè)集合的子集 BOOL

intersectsSet: 判斷兩個(gè)集合是否有交集 BOOL

isEqualToSet: 判斷兩個(gè)集合的元素是否相等

判斷存入NSSet中兩個(gè)元素相等的標(biāo)準(zhǔn):

兩個(gè)對(duì)象通過 isEqual: 方法比較返回YES

兩個(gè)對(duì)象的hash方法返回值也相等

重寫hash方法的注意點(diǎn):

同一對(duì)象多次調(diào)用hash方法應(yīng)該返回值相同

兩個(gè)對(duì)象通過 isEqual: 方法返回YES時(shí),這兩個(gè)對(duì)象的 hash 方法應(yīng)返回相等的值

對(duì)象中作為 isEqual: 標(biāo)準(zhǔn)的實(shí)例變量,都應(yīng)該用來計(jì)算 hashCode值

重寫hash方法的一般步驟:

把對(duì)象內(nèi)每個(gè)用作 isEqual: 比較標(biāo)準(zhǔn)的實(shí)例變量都計(jì)算出一個(gè)int類型的hasCode值

把上一步計(jì)算出來的多個(gè) hashCode 值組合計(jì)算出一個(gè)hashCode值病返回,此處為避免偶然相等,可通過將個(gè)實(shí)例變量的hashCode值乘以任意質(zhì)數(shù)再相加

NSMutableSet的功能與用法

NSMutableSet繼承于NSSet,代表一個(gè)元素可變的NSSet集合,因此創(chuàng)建NSMutableSet時(shí)可以指定底層Hash表的初始容量

NSMutableSet set = [NSMutableSet setWithCapacity:10];

增加的元素操作方法:

addObject: 追加一個(gè)元素

removeObject: 刪除一個(gè)元素

removeAllObjects: 刪除所有元素

addObjectsFromArray: 追加NSArray中的所有元素

unionSet: 計(jì)算兩個(gè)集合的并集

minusSet:計(jì)算兩個(gè)集合的差集

intersectSet:計(jì)算兩個(gè)集合的交集

setSet: 用后一個(gè)集合元素替換已有集合中的所有元素

NSCountedSet的功能與用法

NSCountedSet是NSMutableSet得子類,比之會(huì)額外維護(hù)一個(gè)添加次數(shù)的狀態(tài),多次添加相同元素,添加次數(shù)會(huì)+1,多次刪除相同元素。添加次數(shù)會(huì)-1,當(dāng)元素的添加次數(shù)為0時(shí),該元素才會(huì)真正的被刪除,可通過如下方法獲取指定元素的添加次數(shù):

[set countForObject:@”燃燈”];

有序集合(NSOrderedSet與NSMutableOrderedSet)

具有類似于NSArray和NSSet的功能:

不允許元素重復(fù)

可以保持元素添加的順序,且每個(gè)元素均有索引,可依據(jù)索引來操作元素

字典(NSDictionary與NSMutableDictionary)

NSDictionary的功能與用法

NSDictionary由多組key-value對(duì)組成,key與value可以是任意引用類型的數(shù)據(jù),key不允許重復(fù)。

創(chuàng)建NSDictionary對(duì)象的常見方法:

dictionary 創(chuàng)建一個(gè)不包含任何key-value對(duì)的NSDictionary

dictionaryWithContentsOfFile:/initWithContentsOfFile: 讀取指定文件的內(nèi)容來初始化NSDictionary

dictionaryWithDictionary:/initWithDictionary: 使用已有的NSDictionary包含的key-value對(duì)來初始化NSDictiionary對(duì)象

dictionaryWithObject:forKey: 使用單個(gè)key-value對(duì)來創(chuàng)建NSDictionary對(duì)象

dictionaryWithObjects:forKeys:/initWithObjects:forKeys: 使用兩個(gè)NSArray分別指定為key、value集合,創(chuàng)建多組key-value對(duì)的NSDictionary對(duì)象

dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys: 按 value1,key1,value2,key2,….nil的格式傳值,創(chuàng)建多組key-value對(duì)的NSDictionary對(duì)象

NSDictionary常用的方法:

count 返回key-value對(duì)的數(shù)量

allKeys 返回全部的key

allKeysForObject: 返回指定value的全部key

allValues 返回全部的value

objectForKey: 返回指定key的value

objectForKeyedSubscript: 支持通過下角標(biāo)方式獲取指定key對(duì)應(yīng)的value

valueForKey:返貨指定key的value

keyEnumerator 返回所有key的NSEnumerator對(duì)象

objectEnumerator 返回所有value的NSEnumerator對(duì)象

enmuerateKeysAndObjectsUsingBlock: 使用指定代碼塊來執(zhí)行所有的key-value對(duì)

enumerateKeysAndObjectsWithOptions:usingBlock: 較之上個(gè)方法多個(gè)NSEnumerationOptions參數(shù)

writeToFile:atomically: 寫入指定文件

對(duì)NSDictionary的key排序

keysSortedByValueUsingSelector: 依據(jù)NSDictionary 的所有value的制定方法的返回值對(duì)key排序,該方法必須返回 NSOrederedAscending、NSOrederedDescending、NSOrederedSame 三個(gè)值之一

keysSortedByValueUsingComparator: 該方法使用指定的代碼塊來遍歷 key-value 對(duì),病依據(jù)執(zhí)行結(jié)果(NSOrederedAscending、NSOrederedDescending、NSOrederedSame )對(duì)key排序。

keysSortedByValueWithOptions:usingComparator: 與前一個(gè)方法類似,只是多了一個(gè)NSEnumerationOption參數(shù)

對(duì) NSDictionary的kry進(jìn)行過濾

keysOfEntriesPassTest: 使用代碼塊迭代處理 NSDictionary 的每一個(gè)key- value 對(duì),代碼塊需返回 BOOL 值,返回為 YES 時(shí)才會(huì)被保留,代碼塊可接受三個(gè)參數(shù),key、value、BOOL變量,BOOL變量為NO則會(huì)立即停止迭代

keysOfEntriesWithOptions:passingTest: 與前一個(gè)方法類似,多一個(gè) NSEnumerationOptions 參數(shù)

用自定義類作為NSDictionary的key

自定義類需滿足以下要求:

正確重寫過 isEqual: 和 hash 方法

實(shí)現(xiàn)了 copyWithZone: 方法,該方法最好能返回對(duì)象的不可變副本

NSMutableDictionary的功能與用法

NSMutableDictionary繼承自NSDictionary,代表一個(gè)key-value可變的NSDictionary集合,因此創(chuàng)建NSMutableDictionary時(shí)可以指定初始容量。

setObject:forKey: 設(shè)置一個(gè)key-value對(duì),若已存在,則會(huì)進(jìn)行替換

setObject:forKeyedSubscript: 支持下標(biāo)來設(shè)置key-value對(duì)

addEntriesFromDictionary:將另一個(gè)NSDictionary中的所有key-value對(duì)復(fù)制到當(dāng)前集合中

setDictionary:用另一個(gè)NSDictionary中素有的key-value對(duì)替換當(dāng)前的集合

removeObjectForKey: 刪除指定key的key-value對(duì)

removeAllObjects: 清空集合

removeObjectsForKeys: 使用多個(gè)key組成的NSArray作為參數(shù),刪除指定的多個(gè)key的key-value對(duì)

謂詞

定義謂詞

謂詞用NSPredicate來代表,實(shí)際編程時(shí)會(huì)直接用 predicateWithFormat: 方法,并以謂詞字符串為參數(shù)來創(chuàng)建對(duì)象。

NSPredicate* pred = [NSPredicate predicateWithFormat:@”name like ‘s*’ “];

如果為此中有占位符參數(shù),則需要:

用謂詞的predicateWithSubstitutionVariables: 方法為占位符參數(shù)設(shè)置參數(shù)值

執(zhí)行謂詞的 evaluateWithObject: 方法計(jì)算謂詞的返回結(jié)果 
ps:evaluateWithObject:substitutionVariables: 方法可以同時(shí)完成上面兩步

使用謂詞過濾集合

NSArray和NSMutableArray中提供了如下方法來使用謂詞進(jìn)行過濾:

(NSArray*)filteredArrayUsingPredicate:(NSPredicate*)predicate: 使用指定的謂詞過濾NSArray集合,返回復(fù)合條件的元素組成的新集合

(void)filterUsingPredicate:(NSPredicate*)predicate: 使用指定的謂詞過濾NSMutableArray集合,剔除不符合的元素

NSSet和NSMutableSet提供了如下方法來使用謂詞進(jìn)行過濾:

(NSSet*)filteredSetUsingPredicate:(NSPredicate*)predicate: 用指定的謂詞過濾NSSet集合,返回復(fù)合條件元素組成的新集合

(void)filterUsingPredicate:(NSPredicate*)predicate: 使用指定的謂詞過濾NSMutableSet機(jī)關(guān)和,剔除不符合的元素

在謂詞中使用占位符參數(shù)

謂詞表達(dá)式中支持一下兩個(gè)占位符參數(shù):

%K 動(dòng)態(tài)傳入屬性名

%@ 動(dòng)態(tài)傳入屬性值 
ps:除此之外,還可以在謂詞表達(dá)式中使用童泰改變的屬性值,類似于環(huán)境變量 $SUBSTR

//set為集合,代碼省略
NSSet* set = [NSSet setWithObjects:
[[MyUser alloc] initWithName:@"孫悟空" pass:@"343"], ...];
NSString* prepPath = @"name";
NSString* vaule= @"孫悟空";
//創(chuàng)建謂詞,含有兩個(gè)占位符,后面兩個(gè)變量用于為占位符設(shè)置參數(shù)
NSPredicate* pred = [NSPredicate predicateWithFormat:
@"%K CONTAINS %@", propPath, value];
NSSet* newSet = [set filteredSetUsingPredicate:pred];
//創(chuàng)建謂詞,使用可動(dòng)態(tài)改變的子串,%K占位符使用pass代替
NSPredicate* predTemplate = [NSPredicate predicateWithFormat:@"%K CONTAINS $WUBSTR", @"pass"]
//使用NSDiictionary指定$SUBSTR的值為343NSPredicate pared = [predTemplate predicateWithSubstitutionVariables:
[NSDictionary dictionaryWithObjectsAndKeys:@"343", @"SUBSTR", nil]];
NSSet nesSet2 = [set filteredSetUsingPredicate:pred2];

謂詞表達(dá)式的語法

基本的比較運(yùn)算符

= ==

=> >=

=< <=

>

<

!= <> 不相等

基本的邏輯運(yùn)算符

AND &&

OR ||

NOT !

字符串比較運(yùn)算符

BEGINSWITH

ENDSWITH

CONTAINS

LIKE

MATCHES

PS:比較運(yùn)算符是區(qū)分大小寫和重音符號(hào)的,若想不進(jìn)行區(qū)分,可用[c]不區(qū)分大小寫、[d]不區(qū)分中銀符號(hào)來進(jìn)行修飾。

name CONTAINS[cd] ‘jkl’

操作集合的運(yùn)算符

ANY SOME

ALL

NONE

IN name IN { ‘Ben’, ‘Mel’, ‘Nike’ }

array[index]

array[FIRST]

array[LAST]

array[SIZE] 返回集合的元素個(gè)數(shù)

直接量

FALSE NO

TRUE YES

NULL NIL

SELF

‘text’ “text” 代表字符串

數(shù)組

數(shù)值

2、8、16進(jìn)制數(shù),分別以0b/0o/0x開頭

保留字

AND、OR、IN、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE


Release Notes

Popular Entries