了解OC/第一個OC程序/第一個面向?qū)ο蟪绦虻膱?zhí)行步驟
1.程序語言分類:
a.面向過程C (細節(jié))
b.面向?qū)ο驩C (整體)
2.第一個OC程序
注意創(chuàng)建項目的時候曾我,type -> Foundation(OC), main.c ?—> main.m, #include —> #import
#include同include一樣,解決了重復(fù)導(dǎo)入的問題健民。
在OC項目中抒巢,是兼容C語言的程序,并且可以混搭秉犹。
?邏輯值數(shù)據(jù)類型:
BOOL isFlag = YES; ?//OC中的布爾類型 ?YES 1 ?NO 0
程序中的對象是一片內(nèi)存中的數(shù)據(jù)虐秦。
3.第一個面向?qū)ο蟪绦?br> 對象:對象是客觀存在的,在計算機中凤优,對象就是數(shù)據(jù)悦陋。
類:對象不是憑空出現(xiàn)的,要先設(shè)計經(jīng)過一個過程筑辨,才變成對象俺驶,設(shè)計的內(nèi)容就是類。
描述對象:屬性(有什么), 方法(能干什么)
實例化:類經(jīng)過實例化才會變成對象暮现。
4.第一個面向?qū)ο蟪绦虻膱?zhí)行步驟:
a.類
一個類有兩個部分組成:*.h ?*.m文件
(1).h類的聲明部分: 定義類的interface部分(聲明)
@interface Student:NSObject
?@property int age还绘;//聲明屬性
? ?- (void)study; ?//聲明方法
@end
(2).m類的實現(xiàn)部分(定義)定義類的implemention部分(部分)
@implementation Student ?//方法的定義栖袋、實現(xiàn)
- (void)study ?{ NSLog(@“執(zhí)行了study方法”)拍顷;}
@end
b.實例化
類的實例化通常是寫在main函數(shù)中的。
把內(nèi)的信息從文件中加載到內(nèi)存中塘幅。
#import “Student.h”
[Student alloc]; ?//實例化
Student *stu = [Student alloc];
c.對象
操作對象
對象.屬性 ?stu.age = 18昔案;
[對象 方法]; ?[stu study]; //*調(diào)用對象的方法,向?qū)ο蟀l(fā)送信息电媳。
5. 高內(nèi)聚 低耦合
每個功能模塊踏揣,盡可能的足夠足夠強大。
模塊與模塊之間的關(guān)系盡量松散匾乓。
6.屬性
屬性不能保存數(shù)據(jù)捞稿。實例變量才是真正保存數(shù)據(jù)的地方。
一個對象中的數(shù)值拼缝,真正保存在實例變量中娱局。
通過方法可以操作實例變量,方法是操作實例變量的一種方法咧七。
屬性铃辖,屬性也是訪問實例變量的一種方式,更方便快捷猪叙。
(1) 屬性的本質(zhì):
屬性就是用來訪問實例變量的娇斩。
一個屬性標準由三個部分組成:
a.有一個對應(yīng)的實例變量
b.屬性有兩個方法:
setter方法:- (void)set+”屬性名并首字母大寫”:(實例變量類型)參數(shù)名;
getter方法:- (實例變量名稱)屬性名穴翩;
c.點語法
對象.屬性 = 18犬第; 通過屬性給實例變量賦值
int i = 對象.屬性;通過屬性得到實例變量的值
NSLog(對象.屬性);
(2)聲明式屬性:
a.實例變量
b.自動生成setter / getter方法 ?@property ? @sythesize
c.點語法 ?
(3)IOS5中的屬性
a.實例變量 自動生成
b.聲明式屬性 ?@property ? @sythesize
c.點語法 ?
(4)IOS6中的屬性
a.實例變量 略
b.聲明式屬性 ? @property保留 ? @sythesize略
c.點語法
7.聲明式屬性
(1)默認情況下芒帕,聲明式屬性并沒有解決內(nèi)存問題歉嗓。
需要在聲明屬性的時候加上 retain(@property(retain)…)關(guān)鍵字來解決內(nèi)存問題。
聲明式屬性只是解決setter/getter方法的內(nèi)存問題背蟆,并不會處理dealloc中的內(nèi)存問題鉴分,一個對象銷毀時,要release其擁有的引用類型的實例問題带膀。
(2)聲明式屬性的使用:
如果屬性是引用類型志珍,要使用retain關(guān)鍵字修飾。
@property(retain) TRBook *book;
如果屬性是基本類型垛叨,要使用assign關(guān)鍵字修飾(默認).
@property(assign) int age;
如果屬性是字符串伦糯,要使用copy關(guān)鍵字修飾。
@property(copy) NSString *name;
如果屬性修飾為readonly,則只會生成getter方法敛纲。
如果屬性修飾為getter = method, 對系統(tǒng)自動生成的getter方法名不滿意喂击,也可以通過該關(guān)鍵字修改getter方法名。
day02
一淤翔、初始化方法
創(chuàng)建一個對象的時候翰绊,一定要進行初始化,只需要給對象默認值旁壮,只需要調(diào)用無參的初始化方法监嗜。需要給對象一個指定的值,且需要調(diào)用有參的初始化方法寡具。
初始化方法只是給實例變量(第一時間)賦值的一種方式。
[MyClass alloc]; ? ? ? ? ?int i;
?無參的初始化方法init ? ?int i = 0;默認值
*有參的初始化方法initWith... ? int i = 10;指定值
小結(jié):訪問實例變量有三種方式:
普通方法 ? ?隨意
屬性 ? 簡單
初始化方法 ? 第一時間
二稚补、方法
類只能調(diào)用類方法童叠,實例方法只能通過實例調(diào)用。
1.方法有兩種:
- (void)method;
實例方法:通過實例調(diào)用的方法课幕,叫實例方法厦坛。
實例方法是通過“-”來定義的。
類方法:通過類調(diào)用的方法乍惊,叫類方法杜秸。
類方法是通過“+”來定義的。
2.類方法與實例方法的區(qū)別
類方法與實例無關(guān)润绎,不可以調(diào)用實例變量或?qū)傩曰蚍椒ā?br> 實例方法與實例無關(guān)撬碟,可以調(diào)用實例變量或?qū)傩曰蚍椒ā?br>
3.類方法的時候
類方法主要是用來創(chuàng)建對象的。
類方法中莉撇,是可以訪問類方法創(chuàng)建對象的實例變量或?qū)傩浴?br> 類方法中呢蛤,可以使用self關(guān)鍵字,self關(guān)鍵字代表當(dāng)前類棍郎,主要用來調(diào)用當(dāng)前類中的其他類方法其障。
self關(guān)鍵字
在實例方法中代表當(dāng)前實例;在類方法中代表當(dāng)前類涂佃。
4.工廠方法
(工廠方法是類方法)
為了創(chuàng)建對象根簡單励翼,通過使用工廠方法。
工廠方法也分為兩類:
無參的工廠方法:快速創(chuàng)建默認值的對象辜荠。
有參的工廠方法:快速創(chuàng)建指定值的對象汽抚。
TRMyClass
工廠方法名:是去掉類的前綴,類名小寫伯病。myClass
工廠方法實現(xiàn):
//無參的工廠方法
+ (TRMyClass *)myClass{
return [[TRMyClass alloc] init];
}
//有參的工廠方法
+ (TRMyClass *)myClassWith …A… {
return [[TRMyClass alloc] initWith…A…];
}
小結(jié):
標準的類中應(yīng)該有:
(屬性殊橙、普通方法(查看學(xué)生所有信息)、初始化方法、工廠方法)
屬性(實例變量) ?@property int age;
普通方法 ? ?-(void)show;
初始化方法 ? -(id)initWithAge:(int)age andSex:(char)sex;
工廠方法 ? ?+(TRStudent*)studentWithAge:(int)age andSex:(char)sex;
? ? ? ? ? ? ? ?
// ?單例模式+(TRSingleton*)singleton;
單例方法:創(chuàng)建一個對象的工廠化方法 (面試呦膨蛮!)
前面是:Data叠纹、Image、Video...
后面是:Center敞葛、Store
1) 調(diào)用:DataCenter *sharedDataCenter = [DataCenter sharedDataCenter];
2)單例的用途:全局的數(shù)據(jù)存儲中心
```
必須會默寫
DataCenter.h文件中聲明創(chuàng)建單例方法
+ ( id )sharedDataCenter;
.m文件中實現(xiàn)創(chuàng)建單例方法
static sharedDataCenter *shareDataCenter = nil誉察;
+ ( id )sharedDataCenter {
@synchronized(self){ //加鎖
? ? ? if( sharedDataCenter == nil ) {
sharedDataCenter = [[sharedDataCenter alloc]init];
}
return sharedDataCenter;
? ?}
}
```
## 使用GCD來構(gòu)建單例對象
步驟:
*1. 聲明一個空的靜態(tài)的單例對象
*2. 創(chuàng)建一個靜態(tài)的GCD的單次任務(wù)Token
*3. 執(zhí)行GCD的單次任務(wù),dispatch_once, 任務(wù)就是單例對象的初始化語句惹谐。
*4. 返回創(chuàng)建好的單例對象持偏。
```
+ (id)sharedDataCenter
{
? ?//*1.聲明一個空的靜態(tài)的單例對象 (static 表明在調(diào)用結(jié)束后空間不會被釋放)
? ?static DataCenter *sharedDataCenter = nil;
? ?//*2. 創(chuàng)建一個靜態(tài)的GCD的單次任務(wù)Token
? ?static dispatch_once_t onceToken;
? ?//*3. 執(zhí)行GCD的單次任務(wù),dispatch_once, 任務(wù)就是單例對象的初始化語句氨肌。
? ?dispatch_once(&onceToken,^{
? ? ? ?sharedDataCenter = [[self alloc]init];
? ?});
? ?//*4. 返回創(chuàng)建好的單例對象鸿秆。
? ?return sharedDataCenter;
}
```
day03
1.內(nèi)存管理原理:
在IOS開發(fā)中,有兩種方式管理內(nèi)存怎囚,一種是手動內(nèi)存管理MRC卿叽,一種是自動內(nèi)存管理ARC。
引用計數(shù)器:每個對象都有自己的引用計數(shù)器恳守。
當(dāng)發(fā)送alloc/copy/new消息的時候考婴,會將該對象的引用計數(shù)器設(shè)為1.
當(dāng)對象不再需要的時候,我們會向?qū)ο蟀l(fā)送一個消息release催烘,通知引用計數(shù)器減1沥阱。
當(dāng)對象的引用計數(shù)器為0時,系統(tǒng)會自動銷毀該對象伊群,該對象在銷毀前會自動執(zhí)行dealloc消息考杉。
當(dāng)多個引用共用一個對象的時候,要記得通知引用計數(shù)器加1舰始,發(fā)送retain消息奔则。
? ? 如果引用計數(shù)器使用不當(dāng),會發(fā)生兩種情況:
1)如果引用計數(shù)器少加蔽午,會發(fā)生崩潰易茬、crash。
2)如果引用計數(shù)器多加及老,會發(fā)生資源浪費抽莱、內(nèi)存泄露。
? ?如果想查看當(dāng)前對象的引用計數(shù)器的值骄恶,發(fā)送retainCount消息食铐。
TRBook *book ?= [[TRBook alloc]init];//RC:1
TRBook *book2 = book;//RC:1
//[book2 retain];
[book release];//RC:0
book2 野指針
[book2 release];
TRBook *book2 = [[TRBook alloc]init];//RC:1
[boo2 release];
項目默認的內(nèi)存管理方式是ARC,需要手動進行修改僧鲁。
Objective C Automatic Reference Counting —— NO
當(dāng)對象的引用計數(shù)器為0時虐呻,立刻回收內(nèi)存象泵。
EditScheme —> Diagn… —> EnableZombie… ?-------選中
2.面向?qū)ο蟮娜筇匦?
封裝, 繼承, 多態(tài) ?(面試可能被提問) ?
封裝:把具體的實現(xiàn)放在.m文件中隱藏起來,只給外界訪問公開接口
OC會把向外界公開的屬性和方法放在頭文件里斟叼,把不希望別人訪問的屬性和方法放在.m文件中隱藏起來
OC是單繼承的偶惠,一個類只有一個父類。
C++是多繼承的朗涩,一個類可以有多個父類忽孽。
NSObject是所有類的父類(老祖宗)
*.h 來描述 類與類之間的關(guān)系。
TRDog是子類谢床,TRAnimal是父類兄一。
@interface TRDog:TRAnimal
// 程序中依賴誰就先寫誰的類。
1.繼承:
1.1兩個類之間的關(guān)系识腿。
@interface ? 子類(Sub class) :父類(Super class)
如果子類繼承父類出革,那么子類將擁有父類所有的屬性和方法。
如果子類對繼承父類的方法不滿意渡讼,子類可以重寫父類的方法骂束。
1.2.繼承優(yōu)缺點
a.提高了程序的復(fù)雜度(優(yōu)點)
b.破壞了封裝性
c.降低了可維護性與可擴展性
1.3.為什么使用繼承
a.代碼復(fù)制
b.制定規(guī)則(*)
c.多態(tài)(***)
1.4.彌補繼承代碼復(fù)用缺點
?組合 ?(共存亡一體的)蘋果電腦 ?筆記本
?聚合 ?(弱依賴可拆卸)臺式機 ?車與車輪
CPU ? Computer
A.組合:
? ? 組合的優(yōu)點:
(1) 當(dāng)前對象只能通過所包含的那個對象去調(diào)用其方法,所以所包含的對象的對象的內(nèi)部細節(jié)對當(dāng)前對象是不可見的硝全。
(2)當(dāng)前對象與包含對象是低耦合關(guān)系栖雾,如果修改包含對象的類的代碼楞抡,不需要修改當(dāng)前對象類的代碼伟众。
? ? ? 組合的 缺 點:
只要創(chuàng)建computer對象,那么cpu對象一定會創(chuàng)建召廷。
總結(jié):computer與cpu共存亡 ?
B.聚合:
聚合的優(yōu)點:
?(1)被包含的對象通過包含它們的類來訪問
?(2)很好的封裝
? (3)被包含的對象內(nèi)部細節(jié)不可見凳厢。
? (4)可以在運行時動態(tài)定義聚合的方式
?聚合的 缺點:
? ?(1)系統(tǒng)可能會包含太多對象。
? ?(2)當(dāng)使用不同對象時竞慢,必須小心定義的接口先紫。
C.小結(jié):
不論是組合與聚合都是描述類與類之間的 has a 關(guān)系。
共同點:
保留了封裝性(可擴展性筹煮、可維護性...)
隱藏代碼的實現(xiàn)部分
不同點:
組合:當(dāng)前對象與包含對象遮精,是強依賴,兩者是不能替換的败潦,共生死本冲。一起創(chuàng)建一起銷毀。
聚合:當(dāng)前對象與包含對象劫扒,是弱依賴檬洞,兩者是可替換的,并且生命周期是不一致的沟饥。
D.使用 :
組合:代碼不會經(jīng)常維護添怔,只是想快速使用湾戳。界面Controller、界面中元素View广料、創(chuàng)建Controller的時候砾脑,會同時創(chuàng)建View。
聚合:代碼會經(jīng)常維護或升級性昭。
2.多態(tài):
多種形態(tài)拦止,引用的多態(tài),方法的多種形態(tài)糜颠。
引用的多種形態(tài):可以用父類的引用指向本類對象或子類對象汹族。
方法的多種形態(tài):當(dāng)調(diào)用對象中的方法時,如果沒有重寫父類的方法其兴,則調(diào)用的是父類的方法顶瞒,如果重寫了父類的方法,則調(diào)用的是子類的方法元旬。
?注: 如果使用多態(tài)榴徐,只能調(diào)用子類從父類中繼承的方法,不可以調(diào)用子類獨有的方法匀归。不可以使用子類的引用指向父類的對象坑资。
使用:
(1)多態(tài)可以用于數(shù)組中。
(2)多態(tài)可以用于方法的參數(shù)穆端。
(3)多態(tài)還可以用于方法的返回值類型袱贮。
屏幕快照 2015-05-17 下午4.07.18.png
day03
1.分類(Category):
1.1分類也可以增強一個類的能力。
分類只能給待定的類添加能力体啰。
1.2分類語法:
分類也是將代碼信息保存到文件中攒巍。
.h 文件
@interface 主類類名(分類類名)
添加功能的聲明部分
@end
.m 文件
@implementation 主類類名(分類類名)
添加功能的實現(xiàn)部分
@end
1.3使用
默認情況類不會添加分類的能力,只需要導(dǎo)入分類的頭文件荒勇,類就具備了分類的能力柒莉。
#import “主類類名 + 分類類名.h”
1.4注意:
分類中,不可以定義實例變量沽翔,自然也不可以定義屬性兢孝。
在分類中,是可以訪問主類的實例變量仅偎,也可以訪問主類的屬性跨蟹。
分類不但可以給自定義的類添加能力,還可以給系統(tǒng)的類添加能力哨颂。
2.擴展(Extend):
?可以添加一個私有的能力喷市。
擴展沒有名字,擴展只可以在.m文件中使用威恼。
在擴展中品姓,是可以聲明實例變量的寝并,自然也可以聲明屬性。
在一個類中可以有多個擴展腹备。
3.協(xié)議:
3.1優(yōu)缺點:
優(yōu)點:可以增強一個類的能力衬潦。
缺點:類的本質(zhì)要發(fā)生改變。
3.2協(xié)議的語法:
協(xié)議的定義也是保存在文件中植酥。
語法格式:
@protecal 協(xié)議名 <父協(xié)議>
- (void)method;
@end
給一個類添加協(xié)議(類遵守協(xié)議)
@interface類:父類<協(xié)議>
?注:如果一個類遵守一個協(xié)議镀岛,要實現(xiàn)協(xié)議中要求的屬性或方法。
3.3 使用協(xié)議:
?id <協(xié)議> obj = 遵守協(xié)議的對象友驮;
[obj 協(xié)議要求屬性 / 方法];
3.4 注意:
在協(xié)議中聲明屬性 / 方法是可以使用@required或@optional關(guān)鍵字修飾漂羊,如果使用@required或默認修飾的屬性或必須,在遵守協(xié)議的類中必須實現(xiàn)卸留。
optional關(guān)鍵修飾的屬性 / 方法走越,可選實現(xiàn)的。
3.5 協(xié)議也可以繼承
協(xié)議的繼承相當(dāng)于協(xié)議的合并耻瑟。
@protocal 子協(xié)議 <父協(xié)議>
3.6 一個類也可以遵守多個協(xié)議
@interface類:父類<協(xié)議1旨指,協(xié)議2>
id <協(xié)議1,協(xié)議2> p = [ ... ];
OC
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門囱淋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人餐塘,你說我怎么就攤上這事妥衣。” “怎么了戒傻?”我有些...
- 文/不壞的土叔 我叫張陵税手,是天一觀的道長。 經(jīng)常有香客問我需纳,道長芦倒,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任不翩,我火速辦了婚禮兵扬,結(jié)果婚禮上麻裳,老公的妹妹穿的比我還像新娘。我一直安慰自己器钟,他們只是感情好津坑,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傲霸,像睡著了一般疆瑰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昙啄,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叭莫!你這毒婦竟也來了蹈集?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布浓冒,位于F島的核電站,受9級特大地震影響尖坤,放射性物質(zhì)發(fā)生泄漏稳懒。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一慢味、第九天 我趴在偏房一處隱蔽的房頂上張望场梆。 院中可真熱鬧佛致,春花似錦、人聲如沸辙谜。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽装哆。三九已至罐脊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜕琴,已是汗流浹背萍桌。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 1. 使用 #import 相對c的 include 是防止頭文件的重復(fù)導(dǎo)入 2. NSLog 相對于 print...
- 蘋果官方文檔翻譯 《Objective-C語言編程》(Programming with Objective-C) ...
- 下面是我最近兩年學(xué)習(xí)OC中的一些基礎(chǔ)知識诲祸,對于學(xué)習(xí)OC基礎(chǔ)知識的人可能有些幫助,拿出來分享一下而昨,還是那句話不喜勿噴...