第一講:類、對象
1、OC簡史
1)NextStep公司的由來,cocoa的由來
?????? NeXT是由蘋果公司的創(chuàng)辦人喬布斯于1985年被蘋果公司辭退后同年成立。然后在1996年已4億美元收購下了NeXT。
3)面向?qū)ο笳Z言 :
?????? 面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了
?????? 面向?qū)ο笫前褬?gòu)成問題事物分解出各個對象,建立對象的母的不是為了完成一個步驟,而是為了描述某個事物在整個解決問題的步驟中的行為。面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。比如說要把五子棋改成圍棋,如果你是面向過程的設(shè)計,那么五子棋的規(guī)則分布在了你的程序每一個角落,要改動還不如重寫。而面向?qū)ο蟮脑O(shè)計你只需要改動規(guī)則對象就可以了。五子棋和圍棋的區(qū)別不就是規(guī)則不同嗎?
?????? 五子棋:面向過程的設(shè)計思路就是首先分析問題的步驟:1.開始游戲,2.黑白雙方,3、繪制畫面,4,判斷輸贏,5,輪到白子,6,繪制畫面,7,判斷輸贏,7,返回步驟2、9.輸出最后結(jié)果。把上面每個步驟分別用函數(shù)來實現(xiàn),問題就解決了。
?????? 面向?qū)ο蟮脑O(shè)計則是從另外的思路來解決問題。整個五子棋可以分為1.黑白雙方,這兩方的行為是一模一樣的。2、棋盤系統(tǒng),負責(zé)繪制畫面。3、規(guī)則系統(tǒng),負責(zé)額判定諸如犯規(guī)、輸贏、等。第一類對象(玩家對象)負責(zé)用戶輸入,并告知第二對象(棋盤對象)妻子布局的變化,棋盤對象接受到了棋子的變化,棋盤對象接收到了妻子的變化就要負責(zé)在屏幕上面顯示這種變化,同事利用第三類對象(規(guī)則系統(tǒng))來對棋局進行判定。
2、面向?qū)ο笕筇匦裕?/b>
1)封裝
?????? 封裝的核心就是:不關(guān)心對象的實現(xiàn)方法,不要告訴我你是怎么做,只要做就可以了。我只要結(jié)果
2)繼承
?????? 繼承可以使得之類具有父類的各種屬性和方法,子類可以重寫父類的某些方法,同時也可以在子類追加新的屬性和方法
3)多態(tài)
?? 多態(tài):同一操作作用于不同的對象,可以有不用的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。
有多種表現(xiàn)形式:1.重寫 :配合繼承使用,進行父類方法的重寫
????????????? ?2.方法重載,方法名可以相同,參數(shù)個數(shù),或者參數(shù)類型、返回值不同
各自的含義及如何體現(xiàn);
3、OC語言的特點:
1)封閉式語言;底層源代碼不開源
2)動態(tài)語言;是指程序在運行時可以改變其結(jié)構(gòu):新的函數(shù)可以被引進,已有的函
????????????? ?? 數(shù)可以被刪除等結(jié)構(gòu)上的變化??????? ?
3)C語言擴展集或則子集;C語言的所有關(guān)鍵字及語法可以在OC環(huán)境下正常編譯運行
4、類、對象
1)創(chuàng)建類、創(chuàng)建對象, 快捷鍵使用;
?????? 創(chuàng)建工程及類—>command +shift+N à new projectà EnteràProject Name? à command +N à cocoa class à?1.類名2.繼承自的類3.選擇編程語言àComplete
2)類、對象的關(guān)系;
??? 類和對象的關(guān)系就如同模具制作出的物品之間的關(guān)系。一個類為它的全部對象給出了一個統(tǒng)一的定義,而他的每個對象則是符合這種定義的一個實體,因此類和對象的關(guān)系就是抽象和具體的關(guān)系。
3)@public、@protected、@private關(guān)鍵字的使用及作用;
? private是當前類中可以使用的,在這個類中的其他地方都不可以使用,public是在所有可以訪問到這個類的地方都可以使用。Protected是應(yīng)用與父類當中的,也就是說父類中寫了一個protected的變量,則在其他的子類中也可以訪問到這個變量,但是在父類中如果用到了private的話那么除了這個類可以訪問到這個變量意外其他地方都訪問不到,而public可以說是在任何地方都可以訪問到
5、#import、#include、@class、<> 、 “”各自的含義;
?????? ?????? 1)、#include 會造成重復(fù)引用的問題。例如:class A、class B 都引用了class
C ,class D若引用了class A與 class B ,就會報重復(fù)引用的錯誤。
?
????????????? 2)、#import功能與include功能相同,不過它避免了重復(fù)引用的問題。
????????????? 3)、@class只是告訴編譯器有這個類存在,但是類具體是如何實現(xiàn)的就不用告訴編譯器。
4)、“”,用于對用戶自定義的文件的引用,編譯器首先會去用戶目錄下查找,然后去安裝目錄,最后去系統(tǒng)目錄查找
5)、<>,用于對系統(tǒng)文件的引用,編譯器會在系統(tǒng)目錄下查找該文件。
?????? 6、@有何作用?
??? 關(guān)鍵字起始符,打印對象
7、初始化對象的過程實現(xiàn)
1.首先要有一個類,例:Person
2.在類中定義成員變量:(NSString *)name;
3.重寫init方法:自定義初始化方法:- (instancetype)initWithName:(NSString *)name;
第二講:方法、繼承
1.方法的類型分類:+、-
2、方法調(diào)用語法格式:[]、點語法
3、各種方法的定義語法格式
1)無返回值、無參數(shù)
2)無返回值、帶一個參數(shù)
3)無返回值、帶多個參數(shù)
4)有返回值、無參數(shù)
5)有返回值、帶一個參數(shù)
6)有返回值、帶多個參數(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)單繼承
??? 一個類只能繼承一個父類,父類還可以有父類
2)self、super的使用
?? 當使用self調(diào)用方法時,會從當前類的方法列表中開始找,如果沒有,就從父類中再找,;而當使用super時,則從父類的方法列表中開始找,然后調(diào)用父類這個方法。
3)繼承的優(yōu)點
???繼承的優(yōu)缺點:優(yōu)點新的實現(xiàn)很容易,因為大部分是繼承而來的很容易修改和擴展已有的實現(xiàn)缺點打破了封裝,因為基類向子類暴露了實現(xiàn)細節(jié)白盒重用,因為基類的內(nèi)部細節(jié)通常對子類是可見的當父類的實現(xiàn)改變時可能要相應(yīng)的對子類做出改變不能在運行時改變由父類繼承來的實現(xiàn)?
只有當下列條件滿足時才考慮使用繼承:子類是一種特殊的類型,而不只是父類的一個角色子類的實例不需要變成另一個類的對象子類擴展,而不是覆蓋或者使父類的功能失效
6、多態(tài)
1)概念
2)方法重寫、方法重載
第三講:數(shù)據(jù)類型
[if !supportLists]1、??[endif]OC數(shù)據(jù)類型:typedef、對象
? Typedef類型包括:CGFloat 、NSInteger、NSpoint
可以理解為基本數(shù)據(jù)類型。對象類型,系統(tǒng)提供的有NSNumber、NSValue、NSString、 NSArray 、NSDictionary、
[if !supportLists]2、??[endif]NSNumber對簡單數(shù)據(jù)類型進行封裝和解封裝
封裝:基本數(shù)據(jù)類型à對象類型,方法:【類名numberwith…】
解封裝:對象類型à基本數(shù)據(jù)類型,方法:[對象? integerValue];
[if !supportLists]3、??[endif]NSNumberFormatter對NSNumber數(shù)據(jù)處理格式
步驟:1.首先創(chuàng)建一個NSNumberFormatter格式轉(zhuǎn)換器對象
NSNumberFormatter *formatted= [[NSNumberFormatter? alloc]init];
2.s設(shè)置格式
[formatter setNumberStyle :枚舉類型];
3.創(chuàng)建一個NSNumberFormatter對象。打印即可
4、NSValue對結(jié)構(gòu)體類型進行封裝和解封裝
封裝:結(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)獲取長度、獲取某個字符
【str? length】;
[str?? characterAtIndex:3];
3)字符串截取(頭、尾、中間范圍)
[str? substringToIndex:1];//從頭開始到某個下標結(jié)束
?? [str? substringFormIndex:1];//從某個位置截取到尾部
?[str? substringWithRange:CGRange];
[if !supportLists]5)[endif]字符串拼接(多種方式)
?? //1.初始化方式
.[stringWithFormat:@”%@,%@”,字符串1,字符串2];
2.在尾部拼接
[str1?? stringByAppendingString:字符串1];
3.隨意拼接,可以在@“? ”加入任意內(nèi)容
[str? stringByAppendingFormat:@”%@, %@”,字符串1,字符串2];
? ??4.
把原字符串某個范圍用字符串替換
[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個值
[if !supportLists]2.???[endif]isEqualToString:str1? 返回值?? bool類型? 2個值
[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.每個單詞首字母大寫: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];//賦予的是格林威治時間
2)計算時間差
?????? [date1? timeIntervalSinceDate :date2 ];
3)比較兩個時間
?????? 1.compare
?????? 2.isEqualToDate
?????? 3.earlierDate
?????? 4.laterDate
4)同NSDateFormatter轉(zhuǎn)換時間為某種特定格式
?????? //1.初始化一個時間格式轉(zhuǎn)化器
?????? NSDateFormatter? *formatter1 = [ [NSDateFormatter?? alloc ] init];
?? //2.設(shè)置formatter1的格式
?????? [formatter1? setDateFormat :@”yyyyMMdd”];
.//3.時間轉(zhuǎn)換成字符串
?????? NSString? *str? =[formatter1? stringFormDate:date1];
//4.字符串轉(zhuǎn)換成date? 格式與上邊蛇者的格式一致
[formatter1? dateFormString :@”20150828”];
5)快速得到當前時間的中文完整格式
? ??? NSDate? [ dateWithTimeInter : 3600*8?? sinceDate :date1];
6)NSDate和NSString之間的轉(zhuǎn)換:(需要格式轉(zhuǎn)化器作為中間質(zhì)進行轉(zhuǎn)換)
?????? //1.首先:初始化一個時間格式轉(zhuǎn)換器
NSDateFormatter? *formatter =[[NSDateFormatter alloc]init];
?????? //2.設(shè)置formater的格式
?????? [formatter?? setDateFormate: @”yy年MM/ dd HH:mm :ss”]
?????? //3.通過格式轉(zhuǎ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ì)是一個消息機制的處理模式。用于消息的傳遞,在Cocoa里邊不用自己定義WM_COMMAd_XXX這樣的宏來標識某個消息。Apple在設(shè)計消息的時候就采用了RunLoop;
(?? http://blog.csdn.net/davidsph/article/details/7899760? )有詳細關(guān)于NSTimer的資料
2)結(jié)合日期,完成一個計時器和倒計時功能:初始化出錯了
第四講:集合
[if !supportLists]1、??[endif]集合三大類:數(shù)組、字典、集(有序集合、無序集合)
?
數(shù)組:NSArray :儲存對象類型,同一個數(shù)組可以放得對
?? ??????????????象類型可以不同
字典:NSDictionary:鍵、值對應(yīng)存儲數(shù)據(jù):
?????? ?集:NSSet ,與數(shù)組、字典功能相同。存放的數(shù)據(jù)不重復(fù)且為亂序;在搜索一個一個元素時:NSSet比NSArray效率高。(hash散列排布);
?
2、nil標示、NSNull、NULL對象的區(qū)別
?????? nil?????:是一個對象,值為0;數(shù)組結(jié)尾用nil
?????? NULL? :是基本數(shù)據(jù)類型為空
?????? NSNull:和nil本質(zhì)是一樣的,但在初始化一個數(shù)組空間大小
????????????為0時,用NSArray? *arr =?[ NSNull?? null];
[if !supportLists]4、??[endif]NSArray不可變數(shù)組(對象、有序)
[if !supportLists]1)????[endif]初始化
[if !supportLists]1.???[endif]NSArray? *arr = [[ NSArray alloc] initwithObject:….];//一般初始化
[if !supportLists]2.???[endif][ NSArray?arrWithArray:aArray]; //用一個數(shù)組初始化
[if !supportLists]3.???[endif][NSArray?? arrayWithObjects:數(shù)組元素,多個用逗號隔開]。
4. NSArray?? *arr = @[@”中國”,@(1234),student];
?????? ????????????? //可以存放的有: 字符串? ,數(shù)值對象,自定義對象
[if !supportLists]2)????[endif]獲取元素個數(shù)
[?arr?? count];
[if !supportLists]3)????[endif]獲得某個下標下的元素值、獲得某個元素所在的下標
[if !supportLists]1.???[endif]某個下標的元素:[arrobjectAtIndex : i];
[if !supportLists]2.???[endif]第一個元素?? :[arr? firstObject ];
[if !supportLists]3.???[endif]最后一個元素:[ arr? lastObject];
[if !supportLists]4.???[endif]取某個元素的下標:[arr? indexOfObject:數(shù)組某個元素];
[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]增強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)簡寫@[object,…]
4、NSMutableArray可變數(shù)組
1)繼承于NSArray
2)初始化
3)添加元素
?????? 1.addobject:
?????? 2.insertObject : (id) anObjectatIndex:
4)刪除元素
?????? removeLastObject?移除隊尾元素
?????? removeObjectAtIndex: i
5)交換兩個下標下的元素
?????? exchangeObjectAtIndex :0? withObjectAtIndex :3
5、NSDictionary(鍵值對,無序,鍵唯一)
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)簡寫:@{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、集合類分別在控制臺的顯示形式,如何取出控制臺有效數(shù)據(jù)
9、綜合使用,完成一個通訊錄的過程
第五講:內(nèi)存管理
1、retainCount?? 引用計數(shù)
2、alloc、retain、copy、new、release、autorelease分別對retainCount的影響
?????? 1).alloc、allocwithZone,new,引用計數(shù)+1
?????? 2).retain手動為該對象+1
?????? 3)copy? 對應(yīng)引用計數(shù)+1
?????? 4)mutableCopy
, 創(chuàng)建一個新對象,新對象引用計數(shù)為1
?????? 5)release。手動為該對象引用計數(shù)-1
6)autorelease :加入自動釋放池,當自動釋放池釋放時,對
??????????????????????????????????? 象引用計數(shù)-1
?
3. 各個方法中應(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)對象的setter()中正確的書寫形式
- (void) setName : ( NSString *)name{
??? [ _name? release ];
?????? _name = nil;
?????? _name = [ name? retain];
}
4. NSAutoreleasePool的作用
在自動釋放池內(nèi)部對象 會在釋放池release之后一起釋放
5. dealloc的作用
[if !supportLists]1.??[endif]MRC模式:釋放對象占用的內(nèi)存空間。
[if !supportLists]2.??[endif]ARC模式:釋放 系統(tǒng)無法釋放的該對象占用的資源,或者其他對象對該對象的引用。
6.集合中的內(nèi)存管理
??????
[if !supportLists]7.??[endif]內(nèi)存管理原則
[if !supportLists]1.??[endif]創(chuàng)建了就要release
[if !supportLists]2.??[endif]誰retain?誰release
?
?
8、程序在運行時的內(nèi)存分配
?????? 內(nèi)存分為五大區(qū)域(由上到下):棧區(qū)、堆區(qū),BSS段、數(shù)據(jù)區(qū)、代碼段。(BSS段、數(shù)據(jù)區(qū)、代碼段)三塊是在程序啟動的時候加載的。棧區(qū)從高到底分配地址,堆區(qū)由低到高分配。程序猿只需要管理的內(nèi)存只是在堆區(qū)的對象。而對象的指針在棧中,指向的內(nèi)容在堆區(qū)。
1.堆區(qū):存放程序運行過程中,動態(tài)分配的存儲空間
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,分別有何作用?何時使用?
一、原子性
[if !supportLists]1.??[endif]Nonatomic 對屬性不加鎖,多線程下線程不安全,但速率快
[if !supportLists]2.??[endif]?atomic,對屬性加鎖,多線程下線程安全,默認值
?
二、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方法,默認值
2. readonly?>只生成getter方法
四、強弱引用。
1. ARC模式下>strong修飾對象,強引用。相當于retain,
2.MRC模式下>weak ,修飾對象弱引用,相當于assign直接賦值
?
[if !supportLists]2、??[endif]屬性的優(yōu)點及缺點
屬性就是OC提供給程序員快速生成成員變量的訪問器(set/get)的語法,提供了點語法更加方便間接使用訪問器
?
4、補講內(nèi)容:
1)copy和mutableCopy的區(qū)別及使用
?????? copy (拿NSString做例子)
[if !supportLists]1.???[endif]對于不可變字符串>>淺拷貝,拷貝后是不可變類型字符串,引用計數(shù)2
[if !supportLists]2.???[endif]對于可變字符串?>> 深拷貝,拷貝后是可變類型字符串。引用計數(shù)1
?????? mutableCopy?
[if !supportLists]1.????????[endif]對于不可變字符串 >>深拷貝,拷貝后的是可變類型字符串,引用計數(shù)1
[if !supportLists]2.????????[endif]對于可變字符串 ??>>深拷貝,拷貝后的是可變類型字符串,引用計數(shù)1
2)深復(fù)制和淺復(fù)制
?????? 深拷貝 >>拷貝的是指針,不會開辟新的內(nèi)存空間
?????? 淺拷貝 >>拷貝的是內(nèi)容,要開辟被復(fù)制相同大小,相同內(nèi)容的內(nèi)存空間,
???????????????????? 只是地址不一樣
補充 :Student? ?*std? =[ [Student? alloc ]init];
?????? ? Student??*std1?=[[std?? copy];//需要在Student類重寫copy方法
第七講:單例模式、觀察者模式
1、單例模式的定義及使用過程
1)為何使用單例,單例用來處理哪些問題的?用在哪些場合?
?? ????????? 1.單例模式和靜態(tài)方法相似,但他們一個是面向?qū)ο螅粋€是基于對象的。
如果一個方法和他所在類的實例對象無關(guān),那么它就是靜態(tài)的,反之他就是非靜態(tài)的就可以使用單例模式了。
? ??? 2.單例模式用于處理一種只需要初始化一次,并且在程序運行過程中不被釋放調(diào)的對象。
?????? 3.單例模式用在頁面間的傳值,(UI頁面),一個不被再次初始化的變量
2)static在單例中的作用?
?????? 不加static,是可能被釋放掉得。
3)如何保證單例對象是唯一的
?????? >重寫初始化方法
?????? >重寫allocWithZone方法
?????? >重寫copyWithZone方法
?????? >重寫retain??????????? 方法
?????? >重寫release????????? 方法
?????? >重寫retainCount?? 方法
[if !supportLists]3、??[endif]簡單單例和完整單例的寫法
?
+(UserCenter*)standardUserCenter{
??? if (!instance) {//保證第一次創(chuàng)建成功后不在新建對象
??????? instance =
[[UserCenter alloc]init];
??? }
??? return instance;
}
+(instancetype)allocWithZone:(struct _NSZone*)zone
{
??? if (!instance) {//保證第一次創(chuàng)建成功后不在新建對象
????? 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.為對象添加觀察路徑,判斷需要觀察哪一個屬性
?????? [_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. 測試
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、補講內(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]注意事項
? 如果程序以外退出,數(shù)據(jù)不能及時保存到本地,加上synchronize立即寫入
2)本地持久化的操作
3)存儲數(shù)據(jù)
第八講:類目、延展、協(xié)議
1、類目、延展的定義和使用
類目:為抑制的類增加新的方法@Category
延展:為自己類的實現(xiàn)文件中添加類目來聲明私有方法
@:
?????????? ???? //延展 給類添加私有方法或者成員變量
@interface Student____(){//延展的定義格式
??? //私有成員變量
NSInteger_count;
}
//定義一個私有方法
- (NSString*)returnGenderString;
//私有屬性
@property (nonatomic ,strong)NSString?? *myName;
@end
2、[endif]類目延展的區(qū)別和聯(lián)系
延展是另外一種類目,只不過把類目寫在類的實現(xiàn)文件中
??????
4、類目的優(yōu)勢和局限性
類目的優(yōu)勢:1.通過類目加入的方法,與原類沒有登記差別
2.可以擴展別人實現(xiàn)的類,而且不需要獲得原始類的源代碼
?????? 3.類目添加的方法,類被繼承的時候也一并會被繼承
?
4、協(xié)議的定義和使用,協(xié)議涉及到的關(guān)鍵字
?????? >協(xié)議就是聲明一大堆方法,這些方法未于任何類關(guān)聯(lián)
?????? >協(xié)議就像一個條款一樣,一旦某個對象遵守了這個協(xié)議就要實現(xiàn)協(xié)議里邊的相關(guān)方法
?????? >關(guān)鍵字? @protocol
?
4、代理和協(xié)議的區(qū)別及聯(lián)系
>>委托代理(degegate),把某個對象要做的事情委托給別的對象去做,那么別的對象就是這個對象的代理, 代替他來打理要做的事情。反映到程序中,首先要明確一個對象的委托方是哪個對象,委托所做的內(nèi)容是什么。
>>協(xié)議聲明了可以被任何類實現(xiàn)的方法
協(xié)議不是類,它是定義了一個其他對象可以實現(xiàn)的借口
如果在某個類中實現(xiàn)了協(xié)議中某個方法,也就是實現(xiàn)了這個那個協(xié)議
協(xié)議經(jīng)常用來實現(xiàn)委托對象,一個委托對象是一種用來協(xié)同或者代表其他對象的特殊對象。
委托,就是調(diào)用自己定義方法,別的類來實現(xiàn)。
6、委托模式的講解,以及同notification的區(qū)別