一、Objective-C簡介
1、由C語言發(fā)展而來
2、“時(shí)空人”分析法
時(shí)間分析-發(fā)生在什么時(shí)候?
空間分析-變量放在哪里?
人物分析-代碼哪里來的?
3、編譯clang -fobjc-arc
---------------------------------------------------------------------------------------------
二、類與對(duì)象
對(duì)象是類的實(shí)例,類是對(duì)象的模板。
接口文件.h
@interface?RPoint:?NSObject//繼承NSObject
@property?int?x;//類的屬性-----對(duì)象的狀態(tài)“你有什么”
@property?int?y;//類的屬性-----對(duì)象的狀態(tài)“你有什么”
-(void)?print;//類的方法-----對(duì)象的行為“你能干什么
@end
實(shí)現(xiàn)文件.m
#import//類庫
#import?"rpoint.h"
@implementation?RPoint
-(void)?print{
NSLog(@"[%d,?%d]",?self.x,?self.y);//方法體,“self”當(dāng)前的實(shí)例
}
@end
main文件
#import
#import?"rpoint.h"
int?main(int?argc,?const?char?*?argv[])?{
@autoreleasepool?{
RPoint*?rp1=[[RPoint?alloc]?init];//創(chuàng)建對(duì)象,對(duì)象必須以指針存在,所以需要*號(hào)。alloc向系統(tǒng)請(qǐng)求內(nèi)存分配,加中括號(hào)是方法調(diào)用。init初始化。
rp1.x=10;//訪問屬性
[rp1 print];//發(fā)送消息(調(diào)用方法)
結(jié)構(gòu)的實(shí)例,一般稱為值,類的實(shí)例一般稱為對(duì)象。
1、內(nèi)存分配方式不一樣。
2、結(jié)構(gòu)實(shí)例,沒有方法,不能給他發(fā)消息
對(duì)象:棧上存儲(chǔ)指針,堆上存儲(chǔ)真正的對(duì)象
值:內(nèi)存直接存儲(chǔ)與棧空間
---------------------------------------------------------------------------------------------
三、數(shù)據(jù)成員:屬性與實(shí)例變量
屬性:@property int test;(內(nèi)部狀態(tài))
實(shí)例變量: int _test; 一般在實(shí)現(xiàn)文件中(外部狀態(tài))
實(shí)例變量建議使用self.訪問,避免內(nèi)存出錯(cuò)
屬性的描述特性
讀寫特性:readwrite(默認(rèn)),readonly
多線程特性:atomic(默認(rèn)),nonatomic
內(nèi)存管理特性:strong(默認(rèn)),wead,copy。(強(qiáng)引用可能引起循環(huán)引用!)
---------------------------------------------------------------------------------------------
四、函數(shù)成員:方法
初始化器和析構(gòu)器都是特殊的方法
減號(hào)是實(shí)例方法
加號(hào)是類型方法
小技巧:特殊私有方法,接口內(nèi)不描述接口。
實(shí)例方法,self傳遞實(shí)例對(duì)象的是指針
類方法,self只是當(dāng)前類的表示
---------------------------------------------------------------------------------------------
五、初始化器和析構(gòu)器
初始化器用于初始化對(duì)象實(shí)例或者類型,是一個(gè)特殊的函數(shù)。
對(duì)象初始化器:-(id)init 可以重載多個(gè)
類型初始化器:+(void)initialize只能有一個(gè)
析構(gòu)器用于釋放對(duì)象擁有的資源,無返回值的函數(shù)
對(duì)象析構(gòu)器-(void)dealloc只能有一個(gè)
沒有類型析構(gòu)器
對(duì)象初始化器
初始化對(duì)象實(shí)例,init通常和alloc搭配使用。
alloc所做的事情-NSObject已實(shí)現(xiàn);
在堆上分配合適大小的內(nèi)存
將屬性或者實(shí)例變量內(nèi)存置0
init所做的視頻-可以自定義
調(diào)用父類初始化器【super init】
初始化當(dāng)前對(duì)象實(shí)例變量
new相當(dāng)于調(diào)用alloc/init的無參數(shù)版本
類初始化器
類初始化器initialize負(fù)責(zé)類型級(jí)別的初始化
initialize在每個(gè)類使用之前都系統(tǒng)自動(dòng)調(diào)用,且每個(gè)進(jìn)程周期中,只被調(diào)用一次
子類的initialize會(huì)自動(dòng)調(diào)用父類的initialize
對(duì)象析構(gòu)器
對(duì)象析構(gòu)器dealloc負(fù)責(zé)釋放對(duì)象擁有的動(dòng)態(tài)資源
自動(dòng)實(shí)現(xiàn):ARC將對(duì)象屬性引用計(jì)數(shù)減持
手動(dòng)實(shí)現(xiàn):釋放不受ARC管理的動(dòng)態(tài)內(nèi)存,如malloc分配的內(nèi)存
手動(dòng)實(shí)現(xiàn):關(guān)閉非內(nèi)存資源,如文件句柄、網(wǎng)絡(luò)端口
dealloc由ARC根據(jù)對(duì)象引用計(jì)數(shù)規(guī)則,在釋放對(duì)象內(nèi)存前自動(dòng)調(diào)用,無法手工調(diào)用
子類的dealloc會(huì)自動(dòng)調(diào)用父類的dealloc
---------------------------------------------------------------------------------------------
六、繼承與多態(tài)
封裝 encapsulation
隱藏對(duì)象內(nèi)部實(shí)現(xiàn)細(xì)節(jié),對(duì)外僅提供公共接口訪問
繼承 inheritance
一個(gè)類型在另外類型基礎(chǔ)上進(jìn)行的擴(kuò)展實(shí)現(xiàn)
多態(tài)polymorphism
不同類型針對(duì)同一行為接口的不同實(shí)現(xiàn)方式
認(rèn)識(shí)繼承
繼承:每個(gè)類只能有一個(gè)基類,子類自動(dòng)繼承基類的“實(shí)例變量”“屬性”“實(shí)例方法”“類方法”
了解所有類的根類:NSObject
繼承的兩層含義
成員復(fù)用:子類復(fù)用基類成員
類型抽象:將子類當(dāng)作父類來使用
認(rèn)識(shí)運(yùn)行時(shí)多態(tài) Polymorphism
多態(tài):之類在父類統(tǒng)一行為接口下,表現(xiàn)不同的實(shí)現(xiàn)方式
對(duì)比重寫與重載
之類重寫父類同名同參數(shù)方法:之類只可以重寫父類方法
方法名相同、參數(shù)不同:OC不支持方法的重載
在之類的代碼中,可以使用super來調(diào)用基類的實(shí)現(xiàn)
self具有多態(tài)性,可以指向不同子類
super沒有多態(tài)性,僅指向當(dāng)前父類