第一講:類、對(duì)象
1、OC簡(jiǎn)史
1)NextStep公司的由來,cocoa的由來
?????? NeXT是由蘋果公司的創(chuàng)辦人喬布斯于1985年被蘋果公司辭退后同年成立。然后在1996年已4億美元收購(gòu)下了NeXT猎醇。
3)面向?qū)ο笳Z(yǔ)言 :
?????? 面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn)努溃,使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了
?????? 面向?qū)ο笫前褬?gòu)成問題事物分解出各個(gè)對(duì)象硫嘶,建立對(duì)象的母的不是為了完成一個(gè)步驟,而是為了描述某個(gè)事物在整個(gè)解決問題的步驟中的行為梧税。面向?qū)ο笫且怨δ軄韯澐謫栴}沦疾,而不是步驟称近。比如說要把五子棋改成圍棋,如果你是面向過程的設(shè)計(jì)哮塞,那么五子棋的規(guī)則分布在了你的程序每一個(gè)角落刨秆,要改動(dòng)還不如重寫。而面向?qū)ο蟮脑O(shè)計(jì)你只需要改動(dòng)規(guī)則對(duì)象就可以了忆畅。五子棋和圍棋的區(qū)別不就是規(guī)則不同嗎衡未?
?????? 五子棋:面向過程的設(shè)計(jì)思路就是首先分析問題的步驟:1.開始游戲,2.黑白雙方家凯,3缓醋、繪制畫面,4绊诲,判斷輸贏送粱,5,輪到白子掂之,6抗俄,繪制畫面,7世舰,判斷輸贏动雹,7,返回步驟2冯乘、9.輸出最后結(jié)果洽胶。把上面每個(gè)步驟分別用函數(shù)來實(shí)現(xiàn)晒夹,問題就解決了裆馒。
?????? 面向?qū)ο蟮脑O(shè)計(jì)則是從另外的思路來解決問題。整個(gè)五子棋可以分為1.黑白雙方丐怯,這兩方的行為是一模一樣的喷好。2、棋盤系統(tǒng)读跷,負(fù)責(zé)繪制畫面梗搅。3、規(guī)則系統(tǒng)效览,負(fù)責(zé)額判定諸如犯規(guī)无切、輸贏、等丐枉。第一類對(duì)象(玩家對(duì)象)負(fù)責(zé)用戶輸入哆键,并告知第二對(duì)象(棋盤對(duì)象)妻子布局的變化,棋盤對(duì)象接受到了棋子的變化瘦锹,棋盤對(duì)象接收到了妻子的變化就要負(fù)責(zé)在屏幕上面顯示這種變化籍嘹,同事利用第三類對(duì)象(規(guī)則系統(tǒng))來對(duì)棋局進(jìn)行判定闪盔。
2、面向?qū)ο笕筇匦裕?/b>
1)封裝
?????? 封裝的核心就是:不關(guān)心對(duì)象的實(shí)現(xiàn)方法辱士,不要告訴我你是怎么做泪掀,只要做就可以了。我只要結(jié)果
2)繼承
?????? 繼承可以使得之類具有父類的各種屬性和方法颂碘,子類可以重寫父類的某些方法异赫,同時(shí)也可以在子類追加新的屬性和方法
3)多態(tài)
?? 多態(tài):同一操作作用于不同的對(duì)象,可以有不用的解釋头岔,產(chǎn)生不同的執(zhí)行結(jié)果祝辣。
有多種表現(xiàn)形式:1.重寫 :配合繼承使用,進(jìn)行父類方法的重寫
????????????? ?2.方法重載切油,方法名可以相同蝙斜,參數(shù)個(gè)數(shù),或者參數(shù)類型澎胡、返回值不同
各自的含義及如何體現(xiàn)孕荠;
3、OC語(yǔ)言的特點(diǎn):
1)封閉式語(yǔ)言攻谁;底層源代碼不開源
2)動(dòng)態(tài)語(yǔ)言稚伍;是指程序在運(yùn)行時(shí)可以改變其結(jié)構(gòu):新的函數(shù)可以被引進(jìn),已有的函
????????????? ?? 數(shù)可以被刪除等結(jié)構(gòu)上的變化??????? ?
3)C語(yǔ)言擴(kuò)展集或則子集戚宦;C語(yǔ)言的所有關(guān)鍵字及語(yǔ)法可以在OC環(huán)境下正常編譯運(yùn)行
4个曙、類、對(duì)象
1)創(chuàng)建類受楼、創(chuàng)建對(duì)象垦搬, 快捷鍵使用;
?????? 創(chuàng)建工程及類—>command +shift+N à new projectà EnteràProject Name? à command +N à cocoa class à?1.類名2.繼承自的類3.選擇編程語(yǔ)言àComplete
2)類艳汽、對(duì)象的關(guān)系猴贰;
??? 類和對(duì)象的關(guān)系就如同模具制作出的物品之間的關(guān)系。一個(gè)類為它的全部對(duì)象給出了一個(gè)統(tǒng)一的定義河狐,而他的每個(gè)對(duì)象則是符合這種定義的一個(gè)實(shí)體欢顷,因此類和對(duì)象的關(guān)系就是抽象和具體的關(guān)系床三。
3)@public、@protected、@private關(guān)鍵字的使用及作用按傅;
? private是當(dāng)前類中可以使用的依鸥,在這個(gè)類中的其他地方都不可以使用眶熬,public是在所有可以訪問到這個(gè)類的地方都可以使用侵佃。Protected是應(yīng)用與父類當(dāng)中的,也就是說父類中寫了一個(gè)protected的變量雏赦,則在其他的子類中也可以訪問到這個(gè)變量劫笙,但是在父類中如果用到了private的話那么除了這個(gè)類可以訪問到這個(gè)變量意外其他地方都訪問不到芙扎,而public可以說是在任何地方都可以訪問到
5、#import填大、#include戒洼、@class、<> 允华、 “”各自的含義圈浇;
?????? ?????? 1)、#include 會(huì)造成重復(fù)引用的問題靴寂。例如:class A磷蜀、class B 都引用了class
C ,class D若引用了class A與 class B ,就會(huì)報(bào)重復(fù)引用的錯(cuò)誤百炬。
?
????????????? 2)褐隆、#import功能與include功能相同,不過它避免了重復(fù)引用的問題剖踊。
????????????? 3)庶弃、@class只是告訴編譯器有這個(gè)類存在,但是類具體是如何實(shí)現(xiàn)的就不用告訴編譯器德澈。
4)歇攻、“”,用于對(duì)用戶自定義的文件的引用梆造,編譯器首先會(huì)去用戶目錄下查找缴守,然后去安裝目錄,最后去系統(tǒng)目錄查找
5)镇辉、<>屡穗,用于對(duì)系統(tǒng)文件的引用,編譯器會(huì)在系統(tǒng)目錄下查找該文件摊聋。
?????? 6鸡捐、@有何作用栈暇?
??? 關(guān)鍵字起始符麻裁,打印對(duì)象
7、初始化對(duì)象的過程實(shí)現(xiàn)
1.首先要有一個(gè)類源祈,例:Person
2.在類中定義成員變量:(NSString *)name煎源;
3.重寫init方法:自定義初始化方法:- (instancetype)initWithName:(NSString *)name;
第二講:方法香缺、繼承
1.方法的類型分類:+手销、-
2、方法調(diào)用語(yǔ)法格式:[]图张、點(diǎn)語(yǔ)法
3锋拖、各種方法的定義語(yǔ)法格式
1)無返回值诈悍、無參數(shù)
2)無返回值、帶一個(gè)參數(shù)
3)無返回值兽埃、帶多個(gè)參數(shù)
4)有返回值侥钳、無參數(shù)
5)有返回值、帶一個(gè)參數(shù)
6)有返回值柄错、帶多個(gè)參數(shù)
4舷夺、特殊方法:
1)初始化方法(自定義初始化方法、便利構(gòu)造器初始化方法售貌,系統(tǒng)自帶初始化方法init)
1.???? -(instancetype)initWithName : (NSString *)name{
self? =[super init];
if???? (self){
? ??? _name?= [name retain];
?}
return?self;
}
? 2.?+ (Person *) personWithName : (NSString*)name{
???? Person? *person?= [ [Person alloc ] initWithName :name];
?? [person? autorelease];
?? return?? person;
}
3.
2)setter()给猾、getter()
?? 1. – (void)setName : (NSString*)name{
???????? if? (_name != name){
????????? [_name release];
? ????????? _name =? [name?retain];
????? }
}
?? - (NSString *)name{
???? return? name;
?}
[if !supportLists]4)[endif]description()
?? - (NSString *)description{
??? return? [NSString?stringWithFormmat:@”%@”,yanglingshi shabi];
}
5、繼承
1)單繼承
??? 一個(gè)類只能繼承一個(gè)父類颂跨,父類還可以有父類
2)self敢伸、super的使用
?? 當(dāng)使用self調(diào)用方法時(shí),會(huì)從當(dāng)前類的方法列表中開始找恒削,如果沒有详拙,就從父類中再找,蔓同;而當(dāng)使用super時(shí)饶辙,則從父類的方法列表中開始找,然后調(diào)用父類這個(gè)方法斑粱。
3)繼承的優(yōu)點(diǎn)
???繼承的優(yōu)缺點(diǎn):優(yōu)點(diǎn)新的實(shí)現(xiàn)很容易弃揽,因?yàn)榇蟛糠质抢^承而來的很容易修改和擴(kuò)展已有的實(shí)現(xiàn)缺點(diǎn)打破了封裝,因?yàn)榛愊蜃宇惐┞读藢?shí)現(xiàn)細(xì)節(jié)白盒重用则北,因?yàn)榛惖膬?nèi)部細(xì)節(jié)通常對(duì)子類是可見的當(dāng)父類的實(shí)現(xiàn)改變時(shí)可能要相應(yīng)的對(duì)子類做出改變不能在運(yùn)行時(shí)改變由父類繼承來的實(shí)現(xiàn)?
只有當(dāng)下列條件滿足時(shí)才考慮使用繼承:子類是一種特殊的類型矿微,而不只是父類的一個(gè)角色子類的實(shí)例不需要變成另一個(gè)類的對(duì)象子類擴(kuò)展,而不是覆蓋或者使父類的功能失效
6尚揣、多態(tài)
1)概念
2)方法重寫涌矢、方法重載
第三講:數(shù)據(jù)類型
[if !supportLists]1、??[endif]OC數(shù)據(jù)類型:typedef快骗、對(duì)象
? Typedef類型包括:CGFloat 娜庇、NSInteger、NSpoint
可以理解為基本數(shù)據(jù)類型方篮。對(duì)象類型名秀,系統(tǒng)提供的有NSNumber、NSValue藕溅、NSString匕得、 NSArray 、NSDictionary巾表、
[if !supportLists]2汁掠、??[endif]NSNumber對(duì)簡(jiǎn)單數(shù)據(jù)類型進(jìn)行封裝和解封裝
封裝:基本數(shù)據(jù)類型à對(duì)象類型略吨,方法:【類名numberwith…】
解封裝:對(duì)象類型à基本數(shù)據(jù)類型,方法:[對(duì)象? integerValue];
[if !supportLists]3考阱、??[endif]NSNumberFormatter對(duì)NSNumber數(shù)據(jù)處理格式
步驟:1.首先創(chuàng)建一個(gè)NSNumberFormatter格式轉(zhuǎn)換器對(duì)象
NSNumberFormatter *formatted= [[NSNumberFormatter? alloc]init];
2.s設(shè)置格式
[formatter setNumberStyle :枚舉類型]晋南;
3.創(chuàng)建一個(gè)NSNumberFormatter對(duì)象。打印即可
4羔砾、NSValue對(duì)結(jié)構(gòu)體類型進(jìn)行封裝和解封裝
封裝:結(jié)構(gòu)體有4種:point负间、rect、size姜凄、range政溃。
? [NsVlaue? valueWith…];
解封裝:[value? rectValue];
5、NSString不可變字符串
1)初始化 :三種:
? 1. NSString? *str =?[NSString? alloc]initWithFormat:str1];
?2. NSString??? *str?= [NSString?? stringWithFormat: @”1”];
3.? NSString?? *str?= @”21345”;//iOS 5之后的定義方式
?2)獲取長(zhǎng)度态秧、獲取某個(gè)字符
【str? length】董虱;
[str?? characterAtIndex:3];
3)字符串截取(頭申鱼、尾愤诱、中間范圍)
[str? substringToIndex:1];//從頭開始到某個(gè)下標(biāo)結(jié)束
?? [str? substringFormIndex:1];//從某個(gè)位置截取到尾部
?[str? substringWithRange:CGRange];
[if !supportLists]5)[endif]字符串拼接(多種方式)
?? //1.初始化方式
.[stringWithFormat:@”%@,%@”,字符串1,字符串2];
2.在尾部拼接
[str1?? stringByAppendingString:字符串1];
3.隨意拼接捐友,可以在@“? ”加入任意內(nèi)容
[str? stringByAppendingFormat:@”%@, %@”,字符串1淫半,字符串2];
? ??4.
把原字符串某個(gè)范圍用字符串替換
[str?stringByReplacingCharactersInRange :CGRange withString :字符串]:
[if !supportLists]6)[endif]字符串查找(含xcode6新添加的方法)(頭匣砖、尾科吭、各處)
? 1.頭部? (Bool)[hasPrefix:str1];//是否有前綴字符串str1
2.尾部???(BOOL)[has
Suffix:str1];//是否有后綴字符串str1
3、各處:NSrange range = [str? rangeOfString:@“待查詢字符串”]
? If ( 0 == range.length? && range.location == NSNotFound ){
?????? NSLog(@”%@”,);
}
[if !supportLists]7)[endif]字符串比較(多種比較方式)
[if !supportLists]1.???[endif]compare:str1 返回值 枚舉類型??? 3個(gè)值
[if !supportLists]2.???[endif]isEqualToString:str1? 返回值?? bool類型? 2個(gè)值
[if !supportLists]8)[endif]字符串替換
???? [str? stringByReplacingWithString…:.];
[if !supportLists]9)[endif]字符串與其他基本數(shù)據(jù)類型的轉(zhuǎn)換(int猴鲫、float对人、double、大小寫拂共、array等)
? ?????????? [str? (int牺弄、float、double)Value];
大小寫 :1.大寫:uppercaseString
?????? ??? 2.小寫:lowercaseString
????????????? 3.每個(gè)單詞首字母大寫:capitalizedString
6宜狐、NSMutableString可變字符串
1)初始化 三種:一般初始化和便利構(gòu)造以及第三種我叫不來但很通用
1. NSMutableString? *mstr? = [[ NSMutableString alloc]initWithFormat:@“%@”,str1];
2.NSMutableString? *mstr? = [NSMutableString stringWithFormat:@””];
3. NSMutableString? *mstr? =[ NSMutableString string];
2)插入
insertString:(NSString *) aString atIndex : (NSUinterger)loc;
3)刪除
?????? deleteCharactersInRange: (NSRange )range;
4)追加
?? appendString : (NSString*)aString;
? appendString : (NSString *) format
5)替換
?? repleaseeCharactersInRange? : (NSRange) range withString : (NSString*)aString;
7势告、NSString和NSMutableString的關(guān)系
?????? NSMutableString? 繼承自NSString
8、NSDate
1)初始化
?????? NSDate? *date?= [ NSDate date];//賦予的是格林威治時(shí)間
2)計(jì)算時(shí)間差
?????? [date1? timeIntervalSinceDate :date2 ];
3)比較兩個(gè)時(shí)間
?????? 1.compare
?????? 2.isEqualToDate
?????? 3.earlierDate
?????? 4.laterDate
4)同NSDateFormatter轉(zhuǎn)換時(shí)間為某種特定格式
?????? //1.初始化一個(gè)時(shí)間格式轉(zhuǎn)化器
?????? NSDateFormatter? *formatter1 = [ [NSDateFormatter?? alloc ] init];
?? //2.設(shè)置formatter1的格式
?????? [formatter1? setDateFormat :@”yyyyMMdd”];
.//3.時(shí)間轉(zhuǎn)換成字符串
?????? NSString? *str? =[formatter1? stringFormDate:date1];
//4.字符串轉(zhuǎn)換成date? 格式與上邊蛇者的格式一致
[formatter1? dateFormString :@”20150828”];
5)快速得到當(dāng)前時(shí)間的中文完整格式
? ??? NSDate? [ dateWithTimeInter : 3600*8?? sinceDate :date1];
6)NSDate和NSString之間的轉(zhuǎn)換:(需要格式轉(zhuǎn)化器作為中間質(zhì)進(jìn)行轉(zhuǎn)換)
?????? //1.首先:初始化一個(gè)時(shí)間格式轉(zhuǎn)換器
NSDateFormatter? *formatter =[[NSDateFormatter alloc]init];
?????? //2.設(shè)置formater的格式
?????? [formatter?? setDateFormate: @”yy年MM/ dd HH:mm :ss”]
?????? //3.通過格式轉(zhuǎn)換器進(jìn)行NSDate 和NSString 的轉(zhuǎn)換
1)肌厨、NSDate à? NSString?
?????? NSString??*str? =[formatter?? stringFormDate? :? date];
2)培慌、NSString à? NSDate
?????? NSDate?? *date?=? [formatter?? dateFromString : @” 2015年8月/19 11:59:37”];
9柑爸、NSTimer
1)兩種初始化的區(qū)別(NSRunLoop的使用)
?????? 1.一般初始化:-initWithFireDate:interval:target:selector:userinfo:repeats:
?????? 2.便利構(gòu)造
+ scheduledTimerWithTimeInterVal: invocation :repeats;
?????? 3.NSRunLoop;
?????? NSRunLoop的本質(zhì)是一個(gè)消息機(jī)制的處理模式。用于消息的傳遞盒音,在Cocoa里邊不用自己定義WM_COMMAd_XXX這樣的宏來標(biāo)識(shí)某個(gè)消息表鳍。Apple在設(shè)計(jì)消息的時(shí)候就采用了RunLoop馅而;
(?? http://blog.csdn.net/davidsph/article/details/7899760? )有詳細(xì)關(guān)于NSTimer的資料
2)結(jié)合日期,完成一個(gè)計(jì)時(shí)器和倒計(jì)時(shí)功能:初始化出錯(cuò)了
第四講:集合
[if !supportLists]1譬圣、??[endif]集合三大類:數(shù)組瓮恭、字典、集(有序集合厘熟、無序集合)
?
數(shù)組:NSArray :儲(chǔ)存對(duì)象類型屯蹦,同一個(gè)數(shù)組可以放得對(duì)
?? ??????????????象類型可以不同
字典:NSDictionary:鍵、值對(duì)應(yīng)存儲(chǔ)數(shù)據(jù):
?????? ?集:NSSet ,與數(shù)組绳姨、字典功能相同登澜。存放的數(shù)據(jù)不重復(fù)且為亂序;在搜索一個(gè)一個(gè)元素時(shí):NSSet比NSArray效率高飘庄。(hash散列排布)脑蠕;
?
2、nil標(biāo)示跪削、NSNull谴仙、NULL對(duì)象的區(qū)別
?????? nil?????:是一個(gè)對(duì)象,值為0碾盐;數(shù)組結(jié)尾用nil
?????? NULL? :是基本數(shù)據(jù)類型為空
?????? NSNull:和nil本質(zhì)是一樣的晃跺,但在初始化一個(gè)數(shù)組空間大小
????????????為0時(shí),用NSArray? *arr =?[ NSNull?? null];
[if !supportLists]4毫玖、??[endif]NSArray不可變數(shù)組(對(duì)象哼审、有序)
[if !supportLists]1)????[endif]初始化
[if !supportLists]1.???[endif]NSArray? *arr = [[ NSArray alloc] initwithObject:….];//一般初始化
[if !supportLists]2.???[endif][ NSArray?arrWithArray:aArray]; //用一個(gè)數(shù)組初始化
[if !supportLists]3.???[endif][NSArray?? arrayWithObjects:數(shù)組元素,多個(gè)用逗號(hào)隔開]孕豹。
4. NSArray?? *arr = @[@”中國(guó)”涩盾,@(1234),student];
?????? ????????????? //可以存放的有: 字符串? 励背,數(shù)值對(duì)象春霍,自定義對(duì)象
[if !supportLists]2)????[endif]獲取元素個(gè)數(shù)
[?arr?? count];
[if !supportLists]3)????[endif]獲得某個(gè)下標(biāo)下的元素值、獲得某個(gè)元素所在的下標(biāo)
[if !supportLists]1.???[endif]某個(gè)下標(biāo)的元素:[arrobjectAtIndex : i];
[if !supportLists]2.???[endif]第一個(gè)元素?? :[arr? firstObject ];
[if !supportLists]3.???[endif]最后一個(gè)元素:[ arr? lastObject];
[if !supportLists]4.???[endif]取某個(gè)元素的下標(biāo):[arr? indexOfObject:數(shù)組某個(gè)元素]叶眉;
[if !supportLists]4)????[endif]截取
臥槽址儒。。衅疙。莲趣。
[if !supportLists]5)????[endif]遍歷(三種遍歷方式:普通,快速饱溢,枚舉)
[if !supportLists]1.???[endif]for (int i? = 0 ;? i? < [arr?count] ; i++){
?NSLog (@”%@”, [ objectOfIndex :i ] );
}
[if !supportLists]2.???[endif]增強(qiáng)for
for ( id? obj?? in??array ){
NSLog(@”%@”,obj);
}
[if !supportLists]3.???[endif]迭代器
NSEnumerator? *enumeraror? = [ arr???objectEnumerator];
Id?? obj? = nil;
While? ( obj? = [enumerator nextObject]){
???? NSLog (@”%@”,obj);
}
[if !supportLists]4.???[endif]Block 塊遍歷
? [arr?? enumeratorObjectsUsingBlock:
?????? ^(id? obj, NSUInteger? index , BOOL??*stop){
NSLog (@” %@ ” , obj );
?????? //若終斷循環(huán)
?????? *stop?? =? YES喧伞;
}];
[if !supportLists]6)????[endif]排序(三種排序方式)
[if !supportLists]1.???[endif]sortedArrayUsingSlector
[if !supportLists]2.???[endif]sortArrayUsingComparator
[if !supportLists]3.???[endif]sortedArrayUsingDescriptors&sortUSingDescriptors
7)簡(jiǎn)寫@[object,…]
4、NSMutableArray可變數(shù)組
1)繼承于NSArray
2)初始化
3)添加元素
?????? 1.addobject:
?????? 2.insertObject : (id) anObjectatIndex:
4)刪除元素
?????? removeLastObject?移除隊(duì)尾元素
?????? removeObjectAtIndex: i
5)交換兩個(gè)下標(biāo)下的元素
?????? exchangeObjectAtIndex :0? withObjectAtIndex :3
5、NSDictionary(鍵值對(duì)潘鲫,無序翁逞,鍵唯一)
1)初始化
?????? 1.一般初始化:alloc + initWithObjectAndKeys
?????? 2.遍歷初始化:dictionaryWithObjectAndKeys, nil
?????? 3.快速生成 :@{ @”qq”: @”123456”, @”pass”: @”my love”}
2)取值(key=value)
?????? ?objectForKey
3)遍歷
?????? 1.allValue??? allKey
?????? 2.for-in
4)簡(jiǎn)寫:@{key : value,…};
6、NSMutableDictionary可變字典
1)初始化
繼承自父類NSDictionary , 與父類初始化一樣
2)添加
?????? setObject :??? forKey:
3)移除
?????? removeObjectForKey
7溉仑、NSSet挖函、NSMutableSet
1)初始化
?????? 1.一般初始化: alloc + initWithObjects : ,?? ,?nil;
?????? 2.遍歷初始化:setWithObject:
?????? 3.利用數(shù)組初始化:setWithArray:
2)與數(shù)組的結(jié)合使用
數(shù)組à 集? :setWithArray
集? à 數(shù)組:allObjects;
8、集合類分別在控制臺(tái)的顯示形式浊竟,如何取出控制臺(tái)有效數(shù)據(jù)
9怨喘、綜合使用,完成一個(gè)通訊錄的過程
第五講:內(nèi)存管理
1振定、retainCount?? 引用計(jì)數(shù)
2必怜、alloc、retain吩案、copy棚赔、new、release徘郭、autorelease分別對(duì)retainCount的影響
?????? 1).alloc靠益、allocwithZone,new,引用計(jì)數(shù)+1
?????? 2).retain手動(dòng)為該對(duì)象+1
?????? 3)copy? 對(duì)應(yīng)引用計(jì)數(shù)+1
?????? 4)mutableCopy
, 創(chuàng)建一個(gè)新對(duì)象残揉,新對(duì)象引用計(jì)數(shù)為1
?????? 5)release胧后。手動(dòng)為該對(duì)象引用計(jì)數(shù)-1
6)autorelease :加入自動(dòng)釋放池,當(dāng)自動(dòng)釋放池釋放時(shí)抱环,對(duì)
??????????????????????????????????? 象引用計(jì)數(shù)-1
?
3. 各個(gè)方法中應(yīng)注意的內(nèi)存管理:
?
1)自定義初始化方法壳快;
?????? ?- (instancetype) initWithName :(NSString *)name? age: (NSInteger)age{
?????? self? = [super init];
?? if?????? (self){
?????? _name? = [name?copy];
?????? _age?? = age;
?????? }
?????? return? self;
}
2)便利構(gòu)造器初始化方法;
+ (Person *)personInitWithName : (NSString *)name?? age : (NSInteger) age{
Person?? *person? =? [[Person? alloc ]initWithName :name age:age];
???? [person? autorelease];
Retrun? person;
}
3)對(duì)象的setter()中正確的書寫形式
- (void) setName : ( NSString *)name{
??? [ _name? release ];
?????? _name = nil;
?????? _name = [ name? retain];
}
4. NSAutoreleasePool的作用
在自動(dòng)釋放池內(nèi)部對(duì)象 會(huì)在釋放池release之后一起釋放
5. dealloc的作用
[if !supportLists]1.??[endif]MRC模式:釋放對(duì)象占用的內(nèi)存空間镇草。
[if !supportLists]2.??[endif]ARC模式:釋放 系統(tǒng)無法釋放的該對(duì)象占用的資源眶痰,或者其他對(duì)象對(duì)該對(duì)象的引用。
6.集合中的內(nèi)存管理
??????
[if !supportLists]7.??[endif]內(nèi)存管理原則
[if !supportLists]1.??[endif]創(chuàng)建了就要release
[if !supportLists]2.??[endif]誰retain?誰release
?
?
8梯啤、程序在運(yùn)行時(shí)的內(nèi)存分配
?????? 內(nèi)存分為五大區(qū)域(由上到下):棧區(qū)竖伯、堆區(qū),BSS段因宇、數(shù)據(jù)區(qū)七婴、代碼段。(BSS段察滑、數(shù)據(jù)區(qū)打厘、代碼段)三塊是在程序啟動(dòng)的時(shí)候加載的。棧區(qū)從高到底分配地址贺辰,堆區(qū)由低到高分配户盯。程序猿只需要管理的內(nèi)存只是在堆區(qū)的對(duì)象嵌施。而對(duì)象的指針在棧中,指向的內(nèi)容在堆區(qū)先舷。
1.堆區(qū):存放程序運(yùn)行過程中艰管,動(dòng)態(tài)分配的存儲(chǔ)空間
2.棧區(qū):局部變量
3.BSS段:沒有初始化的全局變量和靜態(tài)變量
4.數(shù)據(jù)區(qū):已經(jīng)初始化的全局變量和靜態(tài)變量滓侍,以及字符串常量
5.代碼段:程序編譯后代碼的內(nèi)容
? ???ààà? 關(guān)系圖在云盤蒋川;
第六講:屬性
1、屬性關(guān)鍵字@property
2撩笆、涉及到的參數(shù):nonatomic捺球、atomic、retain夕冲、assign氮兵、copy、readwrite歹鱼、readonly泣栈、getter(改變名字)、setter弥姻、weak南片、strong,分別有何作用庭敦?何時(shí)使用疼进?
一、原子性
[if !supportLists]1.??[endif]Nonatomic 對(duì)屬性不加鎖秧廉,多線程下線程不安全伞广,但速率快
[if !supportLists]2.??[endif]?atomic,對(duì)屬性加鎖疼电,多線程下線程安全嚼锄,默認(rèn)值
?
二、set方法處理
[if !supportLists]1.??[endif]Retain , 先release原來的值蔽豺,再retain新值
[if !supportLists]2.??[endif]assign区丑, 直接賦值,再retain新值
[if !supportLists]3.??[endif]copy?? 茫虽,先release原來的值刊苍,再copy新值
?
三、讀寫屬性:
1. readwrite >生成getter濒析、setter方法正什,默認(rèn)值
2. readonly?>只生成getter方法
四、強(qiáng)弱引用号杏。
1. ARC模式下>strong修飾對(duì)象婴氮,強(qiáng)引用斯棒。相當(dāng)于retain,
2.MRC模式下>weak ,修飾對(duì)象弱引用主经,相當(dāng)于assign直接賦值
?
[if !supportLists]2荣暮、??[endif]屬性的優(yōu)點(diǎn)及缺點(diǎn)
屬性就是OC提供給程序員快速生成成員變量的訪問器(set/get)的語(yǔ)法,提供了點(diǎn)語(yǔ)法更加方便間接使用訪問器
?
4罩驻、補(bǔ)講內(nèi)容:
1)copy和mutableCopy的區(qū)別及使用
?????? copy (拿NSString做例子)
[if !supportLists]1.???[endif]對(duì)于不可變字符串>>淺拷貝穗酥,拷貝后是不可變類型字符串,引用計(jì)數(shù)2
[if !supportLists]2.???[endif]對(duì)于可變字符串?>> 深拷貝惠遏,拷貝后是可變類型字符串砾跃。引用計(jì)數(shù)1
?????? mutableCopy?
[if !supportLists]1.????????[endif]對(duì)于不可變字符串 >>深拷貝,拷貝后的是可變類型字符串节吮,引用計(jì)數(shù)1
[if !supportLists]2.????????[endif]對(duì)于可變字符串 ??>>深拷貝抽高,拷貝后的是可變類型字符串,引用計(jì)數(shù)1
2)深復(fù)制和淺復(fù)制
?????? 深拷貝 >>拷貝的是指針透绩,不會(huì)開辟新的內(nèi)存空間
?????? 淺拷貝 >>拷貝的是內(nèi)容翘骂,要開辟被復(fù)制相同大小,相同內(nèi)容的內(nèi)存空間帚豪,
???????????????????? 只是地址不一樣
補(bǔ)充 :Student? ?*std? =[ [Student? alloc ]init]碳竟;
?????? ? Student??*std1?=[[std?? copy];//需要在Student類重寫copy方法
第七講:?jiǎn)卫J健⒂^察者模式
1志鞍、單例模式的定義及使用過程
1)為何使用單例瞭亮,單例用來處理哪些問題的?用在哪些場(chǎng)合固棚?
?? ????????? 1.單例模式和靜態(tài)方法相似统翩,但他們一個(gè)是面向?qū)ο螅粋€(gè)是基于對(duì)象的此洲。
如果一個(gè)方法和他所在類的實(shí)例對(duì)象無關(guān)厂汗,那么它就是靜態(tài)的,反之他就是非靜態(tài)的就可以使用單例模式了呜师。
? ??? 2.單例模式用于處理一種只需要初始化一次娶桦,并且在程序運(yùn)行過程中不被釋放調(diào)的對(duì)象。
?????? 3.單例模式用在頁(yè)面間的傳值汁汗,(UI頁(yè)面)衷畦,一個(gè)不被再次初始化的變量
2)static在單例中的作用?
?????? 不加static知牌,是可能被釋放掉得祈争。
3)如何保證單例對(duì)象是唯一的
?????? >重寫初始化方法
?????? >重寫allocWithZone方法
?????? >重寫copyWithZone方法
?????? >重寫retain??????????? 方法
?????? >重寫release????????? 方法
?????? >重寫retainCount?? 方法
[if !supportLists]3、??[endif]簡(jiǎn)單單例和完整單例的寫法
?
+(UserCenter*)standardUserCenter{
??? if (!instance) {//保證第一次創(chuàng)建成功后不在新建對(duì)象
??????? instance =
[[UserCenter alloc]init];
??? }
??? return instance;
}
+(instancetype)allocWithZone:(struct _NSZone*)zone
{
??? if (!instance) {//保證第一次創(chuàng)建成功后不在新建對(duì)象
????? return?? [super allocWithZone:zone];
}
??? return nil;
}
//重寫copy
- (id)copyWithZone:(NSZone*)zone{
??? return self;
}
//非ARC模式下更改retain? release
-(instancetype)retain{
??? return self;
}
- (oneway void)release{
}
- (NSUInteger)retainCount{
??? return NSNotFound;
}
?
3角寸、KVC菩混、KVO的描述
1)KVC的作用及使用忿墅;
?KVC觀察者模式,Key? Value? Code通過setVale? forKey :賦值
2)KVO三大步驟及監(jiān)聽過程
?????? 步驟:1.為對(duì)象添加觀察路徑沮峡,判斷需要觀察哪一個(gè)屬性
?????? [_dog addObserver:self forKeyPath:@"dogName"? options:NSKeyValueObservingOptionNew context:nil]
????????????? 2.重寫觀察響應(yīng)
? ???- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change context:(void*)context
{
??? NSLog(@"媳婦回老家了");
??? NSLog(@"%@",change);
}
????????????? 3. 測(cè)試
Dog? *bmw =? [[Dog? alloc]init];
???????bmw.dogName? =@"byd";
???????Student?*ren? =? [[Student? alloc]init];
???????ren.dog? = bmw;
???????[renaddOB];?? //給狗添加觀察
??????? [bmwsetValue:@"比亞迪" forKeyPath:@"dogName"];
??????? [rensetValue:@"bmw" forKeyPath:@"dog.dogName"];
4疚脐、補(bǔ)講內(nèi)容:
1)NSNotification
2)NSNotificationCenter
3)通知三大步驟
4)和KVO的區(qū)別
5、NSUserDefaults的定義和使用
NSUserDefaults? *userDefaults = [NSUserDefaults standardUserDefaults];
???????NSArray*arr?=? @[student.sName, [NSNumber numberWithInteger:student.sAge]];
???????[arr? writeToFile:@"/Users/rimi/Desktop/123.txt" atomically:NO];
???????[userDefaultssynchronize];
??????? NSArray*arr1? = [NSArray arrayWithContentsOfFile:@"/Users/rimi/Desktop/123.txt"];
[if !supportLists]1)????[endif]注意事項(xiàng)
? 如果程序以外退出邢疙,數(shù)據(jù)不能及時(shí)保存到本地棍弄,加上synchronize立即寫入
2)本地持久化的操作
3)存儲(chǔ)數(shù)據(jù)
第八講:類目、延展秘症、協(xié)議
1照卦、類目式矫、延展的定義和使用
類目:為抑制的類增加新的方法@Category
延展:為自己類的實(shí)現(xiàn)文件中添加類目來聲明私有方法
@:
?????????? ???? //延展 給類添加私有方法或者成員變量
@interface Student____(){//延展的定義格式
??? //私有成員變量
NSInteger_count;
}
//定義一個(gè)私有方法
- (NSString*)returnGenderString;
//私有屬性
@property (nonatomic ,strong)NSString?? *myName;
@end
2乡摹、[endif]類目延展的區(qū)別和聯(lián)系
延展是另外一種類目,只不過把類目寫在類的實(shí)現(xiàn)文件中
??????
4采转、類目的優(yōu)勢(shì)和局限性
類目的優(yōu)勢(shì):1.通過類目加入的方法聪廉,與原類沒有登記差別
2.可以擴(kuò)展別人實(shí)現(xiàn)的類,而且不需要獲得原始類的源代碼
?????? 3.類目添加的方法故慈,類被繼承的時(shí)候也一并會(huì)被繼承
?
4板熊、協(xié)議的定義和使用,協(xié)議涉及到的關(guān)鍵字
?????? >協(xié)議就是聲明一大堆方法察绷,這些方法未于任何類關(guān)聯(lián)
?????? >協(xié)議就像一個(gè)條款一樣干签,一旦某個(gè)對(duì)象遵守了這個(gè)協(xié)議就要實(shí)現(xiàn)協(xié)議里邊的相關(guān)方法
?????? >關(guān)鍵字? @protocol
?
4、代理和協(xié)議的區(qū)別及聯(lián)系
>>委托代理(degegate),把某個(gè)對(duì)象要做的事情委托給別的對(duì)象去做拆撼,那么別的對(duì)象就是這個(gè)對(duì)象的代理容劳, 代替他來打理要做的事情。反映到程序中闸度,首先要明確一個(gè)對(duì)象的委托方是哪個(gè)對(duì)象竭贩,委托所做的內(nèi)容是什么。
>>協(xié)議聲明了可以被任何類實(shí)現(xiàn)的方法
協(xié)議不是類莺禁,它是定義了一個(gè)其他對(duì)象可以實(shí)現(xiàn)的借口
如果在某個(gè)類中實(shí)現(xiàn)了協(xié)議中某個(gè)方法留量,也就是實(shí)現(xiàn)了這個(gè)那個(gè)協(xié)議
協(xié)議經(jīng)常用來實(shí)現(xiàn)委托對(duì)象,一個(gè)委托對(duì)象是一種用來協(xié)同或者代表其他對(duì)象的特殊對(duì)象哟冬。
委托楼熄,就是調(diào)用自己定義方法,別的類來實(shí)現(xiàn)浩峡。
6可岂、委托模式的講解,以及同notification的區(qū)別