IOS學(xué)習(xí)筆記之Object-C(三)

NSArray
有順序滨嘱;固定的,一旦創(chuàng)建灿椅,里面的元素不可變套蒂;只能放OC的對象(且任何OC的對象都能放入);不能放nil(有特殊意義茫蛹,代表數(shù)組結(jié)束);
創(chuàng)建:
NSArray *array = [NSArray array]; //創(chuàng)建一個空數(shù)組
[NSArray arrayWithObject:@"123"];//創(chuàng)建一個帶1個元素的數(shù)組
[NSArray arrayWithObjects:@"123",@"345", nil];//創(chuàng)建一個帶多個元素的數(shù)組操刀,nil表示數(shù)組結(jié)束
方法:
[array count]:返回數(shù)組中元素個數(shù)
[array containsObject:@“123”]:判斷是否包含了某個元素;
[array lastObject]:返回數(shù)組的最后一個元素婴洼;
[array objectAtIndex:1]:返回在index=1處的元素
[array indexOfObject:@“345”]:返回元素在數(shù)組中的位置
[array isEqualToArray:array]:判斷兩個數(shù)組里的元素是否相同
[array makeObjectsPerformSelector:@selector(length)]:讓元素內(nèi)所有的元素都調(diào)用一次元素的方法(這里是str的length方法)骨坑;
可帶參數(shù):withObject:執(zhí)行的方法可帶一個參數(shù)(但最多只能帶一個參數(shù));
[array arrayByAddingObject:@“3”]:添加一個元素,返回一個新數(shù)組欢唾,原數(shù)組array不變且警;
[array arrayByAddingObjectsFromArray:array2]:將兩個數(shù)組合并,返回一個新的數(shù)組礁遣,原數(shù)組都不變斑芜;
array3 subarrayWithRange:NSMakeRange(1, 2):截取指定范圍和長度的元素,返回一個新的數(shù)組
[array componentsJoinedByString:@“,”]:用指定的分隔符拼接所有的元素祟霍,返回一個拼接后的字符串
[array writeToFile:@"/Users/sionfan/work/aaa.xml" atomically:YES];//將數(shù)組寫入到文件中杏头;
[NSArray arrayWithContentsOfFile:path]://從文件中讀取一個數(shù)組,但文件中的格式必須是和生成的的格式一樣的xml
— 排序 -
[array sortedArrayUsingSelector:@selector(compare:)]:返回一個排好序的新數(shù)組浅碾,原數(shù)組的內(nèi)容順序都不會改變大州;會使用對象的指定的方法進(jìn)行排序;(同java,需要在對象的類中實(shí)現(xiàn)一個比較方法垂谢,如-(NSComparisonResult)compareStudent:(Student *)stu厦画;);
利用block排序sortedArrayUsingComparator滥朱,(同java)需要修改自動生成的方法的形參名:

 //利用block進(jìn)行排序
     NSArray *stus3 = [stus sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {
        //先按姓排序
        NSComparisonResult result = [obj1.lastName compare:obj2.lastName];
        if (result == NSOrderedSame) {
            //姓相同
            result = [obj1.fistName compare:obj2.fistName];
        }
        return result;
    }];

多條件排序 sortedArrayUsingDescriptors:desces

//先按書名排序,對應(yīng)上student類中book.bookName的名字根暑;
    NSSortDescriptor *bookDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.bookName" ascending:YES];
    //再按姓進(jìn)行排序
    NSSortDescriptor *lastDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES];
    //再按名進(jìn)行排序
    NSSortDescriptor *firstDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES];
    //順序添加排序描述器到數(shù)組
    NSArray *desces = [NSArray arrayWithObjects:bookDesc,lastDesc,firstDesc, nil];
    NSArray *stus5 = [stus sortedArrayUsingDescriptors:desces];

@[@“,@“””]徙邻;可直接創(chuàng)建一個數(shù)組排嫌,但是不可變數(shù)組(NSArray)

++ 遍歷(4種方式) +

for(int i;i<count;i++){id obj = [array objectAtIndex:i]};
for(id *str in array){..str..};//快速遍歷
  [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //id obj:遍歷到的對象
        //idx :遍歷到的位置
        //stop:是否要中止遍歷;*stop = YES;//加*才能改變外面的bool值
        NSLog(@"%@,%i",obj,idx);
    }];

迭代器遍歷

//迭代器遍歷,先產(chǎn)生一個迭代器
    //正向迭代器
//    NSEnumerator *enumerator = [array objectEnumerator];
    //返序迭代器缰犁,從末尾迭代
    NSEnumerator *enumerator = [array reverseObjectEnumerator];
    //獲取下一個需要遍歷的元素
    id obj = nil;
    while(obj = [enumerator nextObject]){
        NSLog(@"%@",obj);
    };
    //返回迭代器中所有元素組的一個數(shù)組,只取出沒有遍歷過的對象淳地,所有在while遍歷后為空
    NSArray *array2 = [enumerator allObjects];

+NSMutableArray 繼承自NSArray,可變數(shù)組
實(shí)現(xiàn)所有NSArray的方法;
增加
add**
insert**,replace**及remove**方法帅容;[調(diào)用一次add**方法會調(diào)用元素retain操作颇象,計數(shù)器值+1;調(diào)用一次remove**方法會調(diào)用元素的release操作并徘,計數(shù)器值-1遣钳;以此保證不會內(nèi)存泄露]
[排序:由于可變,可直接對本數(shù)組進(jìn)行排序麦乞,故對應(yīng)的方法多了三個沒有_ed的排序方法蕴茴,可直接對原數(shù)組進(jìn)行排序]

只能添加不為nil的OC對象

** 內(nèi)存管理 **
當(dāng)把一個對象塞進(jìn)一個數(shù)組中時,這個對象的計數(shù)器會加1姐直;
//當(dāng)數(shù)組被銷毀時倦淀,會對內(nèi)部的所有元素都做一次release操作;
[array release];

  • NSSet (同java中的set声畏,不常用)

+NSDictionary字典撞叽,通過惟一的key找到對應(yīng)的value(類似于java中的map)
NSDictionary是不可變的;一旦創(chuàng)建就不可再更改;不能放基本數(shù)據(jù)和nil;只能放OC對象能扒;(key唯一)
— 創(chuàng)建 —
[NSDictionary dictionary]:
[NSDictionary dictionaryWithObject:@"v" forKey:@“key”];
[NSDictionary dictionaryWithObjectsAndKeys:@"v2",@"k1",@"v3",@"k2", nil];
[NSDictionary dictionaryWithContentsOfFile:path]:從一個文件讀取并生成一個map;但必須先是生成格式的xml
[NSDictionary dictionaryWithObjects:objects forKeys:keys];
— 方法 —
[dict count]:有幾個鍵值對辫狼;
[dict objectForKey:@“k1”]:通過key找value;但只能取初斑,不能改;
[dict writeToFile:@"/Users/sionfan/work/ddd.txt" atomically:YES]; //將字典寫入到一個文件中,也是生成一個xml文件膨处;
[dict allKeys]:所有的key的NSArray(無順序)
[dict allValues]:所有的value的NSArray(無順序)
[dict3 objectsForKeys:[NSArray arrayWithObjects:@"k1",@"k2",@"k3", nil] notFoundMarker:@“notfound”];//用一組keys找一組values;notFoundMarker是沒有的找到時的返回值见秤,不能為nil;
[dict keysSorted*:]對keys進(jìn)行排序真椿;相當(dāng)于對keys這個NSArray進(jìn)行排序鹃答,方法也類似;
—遍歷—

  //1.循環(huán)遍歷
    for(id key in dict3){
        NSLog(@"%@ = %@",key,[dict3 objectForKey:key]);
    }
    //2.迭代器遍歷 key迭代器
    NSEnumerator *keyEnumerator = [dict3 keyEnumerator];
    //value迭代器
//    NSEnumerator *valueEnumerator = [dict3 objectEnumerator];
    id key = nil;
    while (key = [keyEnumerator nextObject]) {
        NSLog(@"%@ = %@",key,[dict3 objectForKey:key]);
    }
    //3.block迭代器遍歷
    [dict3 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        //*stop=YES,停止遍歷
        NSLog(@"block %@ = %@",key,obj);
    }];

— NSDictionary內(nèi)存管理—同NSArray突硝;在創(chuàng)建時對象引用+1;在調(diào)用remove**方法時會對remove的對象調(diào)用一次release操作测摔;當(dāng)dict銷毀時也會對里面所有的key和value執(zhí)行一次release操作(計數(shù)器值-1);

+NSMutableDictionary是NSDictionary的子類
增加修改類的方法
set**;add**;remove**;replace**
[void * 代表任何指針]
[在對json數(shù)據(jù)解析時解恰,若數(shù)據(jù)的值為null或?yàn)榭辗姘耍粍t不會創(chuàng)建這個鍵值對]

+NSValue
用于包裝結(jié)構(gòu)體,也能包裝任意類型(包裝基本類型)。
包裝:valueWith**:
解包:**Value:
對于自定義的結(jié)構(gòu)體:

 Date date = {1999,9,12};
    char *type = @encode(Date);//根據(jù)結(jié)構(gòu)體類型生成對應(yīng)的類型描述字符串
    NSValue *dateValue =  [NSValue value:&date withObjCType:type];
//取出時护盈,先定義一個結(jié)構(gòu)體
    Date d2 ;
    //取出放入的值
    [dateValue getValue:&d2];
    //取出放入的objcType
    [dateValue objCType];

+NSNumber繼承自NSValue
由于字典和數(shù)組不能放入基本數(shù)據(jù)挟纱,故需要轉(zhuǎn)換;這里可用NSNumber來包裝腐宋。但不像java那樣自動打包解包紊服;放入什么,取出來就是什么胸竞;(但只能包裝基本數(shù)據(jù)欺嗤,不能包裝結(jié)構(gòu)體)
初始化:
numberWith**(基本類型:)
還原成基本類型:init**;

+NSNull
由于集合中不能放空(nil);為了達(dá)到能放入一個空值,就使用NSNull撤师。是一個OC對象剂府。
創(chuàng)建:只有一個方法 [NSNull null]:
是單例的(所有的對象指向的都是同一塊地址)

++ NSDate ++時間相關(guān)

 //NSData,是一個字節(jié)數(shù)組(類似于Java中的byte[]);
    //NSDate才是時間
    NSDate *date = [NSDate date];//返回當(dāng)前時間
    NSLog(@"%@",date);
    //單位是秒剃盾,IOS中的時間都是以秒為單位
    date = [NSDate dateWithTimeIntervalSinceNow:10];//以當(dāng)前時間+10
    NSLog(@"%@",date);
    date = [NSDate dateWithTimeIntervalSince1970:100];//以70-1-1年的時間開始增加腺占,將long型毫秒值轉(zhuǎn)成Date
    NSLog(@"%@",date);
    date = [NSDate distantFuture];//隨機(jī)的返回一個將來的時間
    date = [NSDate distantPast];//隨機(jī)的返回一個過去的時間
    NSTimeInterval interval = [date timeIntervalSinceReferenceDate];//返回毫秒數(shù)long
//    [date timeIntervalSince1970];//返回當(dāng)前時間的毫秒值
    //    [date isEqualToDate:[NSDate date]];//比較兩個時間是否相同
    //    [date earlierDate:date1];//返回比較早的那個時間
    //    [date laterDate:date1];//返回比較晚的那個時間
    //時間格式化
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
    NSString *time =   [formatter stringFromDate:date];//將日期轉(zhuǎn)換成string
    time = @"2016-02-03 10:23:30";
    date = [formatter dateFromString:time];//將string轉(zhuǎn)換成日期
    NSCalendar *calender = [NSCalendar currentCalendar];//類似于Java中 Calender

+NSObject與反射

 id stu = [Student new];
    //isKindOfClass 判斷對象是否屬于某個類 或者 子類
    if ([stu isKindOfClass:[Student class]]) {
        NSLog(@"屬于這個類");
    }
    //isMemberOfClass 判斷對象是否屬于某個類(但不包括子類)
    if([stu isMemberOfClass:[Student class]]){
        NSLog(@"屬于這個類");
    }
    //間接調(diào)用對象的方法,還要帶其他參數(shù)
    //    [stu performSelector:@selector(test)];
    //延遲調(diào)用痒谴,在IOS中才有用衰伯,main是循環(huán)的,才能執(zhí)行积蔚,在命令行的項目中意鲸,main只有一次,不能延遲
    //    [stu performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#>]
    //其他線程調(diào)用對象的方法
    //    [stu performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>]

+反射

 //反射,通過字符串生成一個對象
    NSString *str = @"Student";
    Class class = NSClassFromString(str);
    //類的反射
    Student *stu = [[class alloc] init];
    //Class 變成字符串
    //    NSString *name = NSStringFromClass([Student class]);
    NSLog(@"%@",stu);
    //方法的反射
    NSString *method = @"test";
    //得到方法
    SEL selector = NSSelectorFromString(method);
    //執(zhí)行方法
    [stu performSelector:selector];
    //將SEL轉(zhuǎn)化為字符串
    NSString *selectorName = NSStringFromSelector(selector);

+copy
目的:就是對一個對象和集合的拷貝怎顾,改變副本不影響原對象(同java中的clone)读慎。
創(chuàng)建不可變副本(copy):要先實(shí)現(xiàn)NSCopying協(xié)議,創(chuàng)建的是不可變副本(NSString,NSArray)槐雾;
創(chuàng)建可變副本(mutableCopy)夭委,要實(shí)現(xiàn)NSMutableCopying協(xié)議,用于創(chuàng)建可變副本(NSMutableString,NSMutableArray)募强;

深拷貝(mutableCopy株灸,內(nèi)容拷貝):是會產(chǎn)生一個新的對象,是真正的拷貝,從內(nèi)存中拷貝出一份擎值,并指向它慌烧。新對象的計數(shù)器值為1,原對象的計數(shù)器值不變鸠儿。
淺拷貝(copy):只是簡單的指針拷貝(地址拷貝)屹蚊。如對于如NSString的對象,由于這類對象本身不可改變捆交,為了性能提升淑翼,故copy方法不會創(chuàng)建一個新的對象,是將原對象本身返回品追,且原對象的計數(shù)器+1(相當(dāng)于retain操作)
[兩者區(qū)別是有沒有產(chǎn)生新對象玄括;但還有特殊情況,是NSMutableString str=..;NSString *str2 = [str copy];
//可變對象 ——> 不可變對象 和 不可變對象 ——> 可變對象肉瓦,由于拷貝出的對象與原對象的結(jié)構(gòu)都不一樣遭京,所以不能簡單的指針拷貝,故是深拷貝泞莉。(只有一種情況:不可變—copy—>不可變才是淺拷貝)]
在定義對象時用copy: @property (nonatomic,copy) NSString *lastName;//修改外面的變量哪雕,不會影響到內(nèi)部的成員變量(對于固定的NSString一般用copy,不允許隨便修改)
則代表在set方法中鲫趁,會release舊對象斯嚎,copy新對象:[_lastName release];_lastName = [lastName copy];
在外面用操作mutable時,就不會改變對象中的值:NSMutableString *string = …; stu.lastName = string;//賦值挨厚; [string appendString@“..”];//改變賦值的字符串堡僻,則不會改變對象中的字符串的值。(用retain疫剃,則對象中的值會改變)

使用copy時钉疫,建議使用[self class]代替類名;
[子類繼承父類巢价,在構(gòu)造方法時牲阁,實(shí)例化使用Student *stu = [[[self class] alloc] init];//讓子類來調(diào)用父類的方法固阁,不然父類可能調(diào)用到子類的方法,出現(xiàn)找不到方法的錯誤]

博客地址:IOS學(xué)習(xí)筆記之Object-C(三)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末城菊,一起剝皮案震驚了整個濱河市备燃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凌唬,老刑警劉巖赚爵,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異法瑟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唁奢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門霎挟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麻掸,你說我怎么就攤上這事酥夭。” “怎么了脊奋?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵熬北,是天一觀的道長。 經(jīng)常有香客問我诚隙,道長讶隐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任久又,我火速辦了婚禮巫延,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘地消。我一直安慰自己炉峰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布脉执。 她就那樣靜靜地躺著疼阔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪半夷。 梳的紋絲不亂的頭發(fā)上婆廊,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音玻熙,去河邊找鬼否彩。 笑死,一個胖子當(dāng)著我的面吹牛嗦随,可吹牛的內(nèi)容都是我干的列荔。 我是一名探鬼主播敬尺,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贴浙!你這毒婦竟也來了砂吞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤崎溃,失蹤者是張志新(化名)和其女友劉穎蜻直,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袁串,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡概而,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了囱修。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赎瑰。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖破镰,靈堂內(nèi)的尸體忽然破棺而出餐曼,到底是詐尸還是另有隱情,我是刑警寧澤鲜漩,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布源譬,位于F島的核電站,受9級特大地震影響孕似,放射性物質(zhì)發(fā)生泄漏踩娘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一喉祭、第九天 我趴在偏房一處隱蔽的房頂上張望霸饲。 院中可真熱鬧,春花似錦臂拓、人聲如沸厚脉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傻工。三九已至,卻和暖如春孵滞,著一層夾襖步出監(jiān)牢的瞬間中捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工坊饶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泄伪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓匿级,卻偏偏與公主長得像蟋滴,于是被迫代替她去往敵國和親染厅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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

  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 873評論 0 2
  • 軟解碼和硬解碼有什么區(qū)別津函?硬解碼:由顯卡核心GPU來對高清視頻進(jìn)行解碼工作肖粮,CPU占用率很低,畫質(zhì)效果比軟解碼略差...
    Code丶Ling閱讀 13,197評論 1 3
  • package com.bwie.text;import java.util.List;import com.bw...
    丶小丑閱讀 346評論 0 1
  • Dracula閱讀到一半尔苦,小說通過日記體的方式涩馆,通過不同人的日記描述,了解事情的來龍去脈允坚,感受Dracula的可怕...
    依然如水閱讀 300評論 0 3