国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

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

2019-11-07 23:25:39
字體:
供稿:網(wǎng)友

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)容順序都不會改變;會使用對象的指定的方法進行排序;(同java,需要在對象的類中實現(xiàn)一個比較方法,如-(NSComparisonResult)compareStudent:(Student *)stu;); 利用block排序sortedArrayUsingComparator,(同java)需要修改自動生成的方法的形參名:

//利用block進行排序 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]; //再按姓進行排序 NSSortDescriptor *lastDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]; //再按名進行排序 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ù)組 實現(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ù)組進行排序,故對應(yīng)的方法多了三個沒有_ed的排序方法,可直接對原數(shù)組進行排序]

只能添加不為nil的OC對象

* 內(nèi)存管理 * 當把一個對象塞進一個數(shù)組中時,這個對象的計數(shù)器會加1; //當數(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(無順序) [dict3 objectsForKeys:[NSArray arrayWithObjects:@”k1”,@”k2”,@”k3”, nil] notFoundMarker:@“notfound”];//用一組keys找一組values;notFoundMarker是沒有的找到時的返回值,不能為nil; [dict keysSorted***:]對keys進行排序;相當于對keys這個NSArray進行排序,方法也類似; —遍歷—

//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操作;當dict銷毀時也會對里面所有的key和value執(zhí)行一次release操作(計數(shù)器值-1);

++NSMutableDictionary++是NSDictionary的子類 增加修改類的方法 set***;add***;remove***;replace*** [void * 代表任何指針] [在對json數(shù)據(jù)解析時,若數(shù)據(jù)的值為null或為空;則不會創(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);為了達到能放入一個空值,就使用NSNull。是一個OC對象。 創(chuàng)建:只有一個方法 [NSNull null]: 是單例的(所有的對象指向的都是同一塊地址)

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

//NSData,是一個字節(jié)數(shù)組(類似于Java中的byte[]); //NSDate才是時間 NSDate *date = [NSDate date];//返回當前時間 NSLog(@"%@",date); //單位是秒,IOS中的時間都是以秒為單位 date = [NSDate dateWithTimeIntervalSinceNow:10];//以當前時間+10 NSLog(@"%@",date); date = [NSDate dateWithTimeIntervalSince1970:100];//以70-1-1年的時間開始增加,將long型毫秒值轉(zhuǎn)成Date NSLog(@"%@",date); date = [NSDate distantFuture];//隨機的返回一個將來的時間 date = [NSDate distantPast];//隨機的返回一個過去的時間 NSTimeInterval interval = [date timeIntervalSinceReferenceDate];//返回毫秒數(shù)long// [date timeIntervalSince1970];//返回當前時間的毫秒值 // [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):要先實現(xiàn)NSCopying協(xié)議,創(chuàng)建的是不可變副本(NSString,NSArray); *創(chuàng)建可變副本(mutableCopy),要實現(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(相當于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)造方法時,實例化使用Student *stu = [[[self class] alloc] init];//讓子類來調(diào)用父類的方法,不然父類可能調(diào)用到子類的方法,出現(xiàn)找不到方法的錯誤]

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 随州市| 北碚区| 内丘县| 澎湖县| 龙门县| 远安县| 江西省| 西畴县| 绥中县| 永川市| 新竹县| 同江市| 濮阳市| 临澧县| 桂林市| 台江县| 资阳市| 垫江县| 商洛市| 武鸣县| 永兴县| 内丘县| 阳东县| 如东县| 古交市| 简阳市| 乐山市| 石柱| 苏尼特左旗| 巫山县| 怀集县| 祁门县| 长沙县| 岑巩县| 新田县| 伊金霍洛旗| 侯马市| 华蓥市| 惠安县| 曲麻莱县| 临邑县|