無標(biāo)題愛的文章

title: OC_Note date: 2014-10-21 21:16:49tags: OC-NOTESimageNSLog 與 printf的不同1. NSLog接收oc字符串作為參數(shù)槐雾,printf接收c語言的字符串作為參數(shù)2. NSLog輸出后會自動換行薛窥,printf在輸出后不會自動換行3. 使用NSLog時(shí),需要包含頭文件#import盯仪;而使用printf時(shí)晕粪,需要包含頭文件#include4. NSLog可以輸出日期耕姊,時(shí)間戳高帖,進(jìn)程號等信息枕稀,而printf不能輸出這些信息

常用術(shù)語

面向過程 : Procedure Oriented

面向?qū)ο?: Object Oriented 捐名,簡稱OO

面向編程 : Object Oriented Programming旦万,簡稱OOP

OC 語法

類的聲明

@interface 類名:父類(默認(rèn)為 NSObject 該類時(shí)根類)

{

定義成員變量;(默認(rèn)情況下镶蹋,成員變量為protect類型成艘,)

}

( 可以用@public將其定義為public類型,此時(shí)定義的屬性或變量允許被外界訪問)

@property(nonatomic/atomic,readonly/readwrite,assign/strong/retain/wake)類型 屬性名贺归;(定義屬性可以自動生成setter和getter方法)

聲明類方法淆两;(標(biāo)識 + 該方法向類發(fā)消息)

聲明實(shí)例方法; (標(biāo)識 - 該方法向?qū)ο蟀l(fā)消息) 聲明類方法時(shí) 返回值最好定義為`instancetype`類型

@end

類的實(shí)現(xiàn)

@implemention 類名

- 實(shí)例方法

實(shí)現(xiàn)代碼拂酣;

+ 類fangfa

實(shí)現(xiàn)代碼秋冰;

重寫父類方法;

如:descripition婶熬、 dealloc剑勾、init等

@end

3.創(chuàng)建對象

1.包含所創(chuàng)建類的頭文件

2.類名 *對象名埃撵;

2.1 類名 *對象名 = [[類名 alloc]init];(創(chuàng)建對象并為其分配內(nèi)存虽另、初始化)

2.2 類名 *對象名 = [類名 new]暂刘;(每次都會創(chuàng)建出新的對象,并且返回對象的地址捂刺。)

3. 給對象賦值谣拣;(可以調(diào)用相應(yīng)的類方法);

4. 給對象發(fā)消息族展,完成所需要進(jìn)行的操作森缠;[對象 方法];

匿名對象

方法調(diào)用:

[[類名 new]方法]仪缸;/[[[類名 alloc]init]方法]贵涵;

屬性訪問:

[類名 new]->屬性 = 賦值;(外界訪問定義為public類型的屬性)

OC方法和函數(shù)的區(qū)別

1. OC方法的聲明只能在@interface 和 @end之間腹殿,只能在@implementation 和 @end之間独悴。即OC方法獨(dú)立于類存在。

2. C函數(shù)不屬于類锣尉,跟類沒有聯(lián)系,C函數(shù)所有權(quán)只屬于定義函數(shù)的文件

3. C函數(shù)不能訪問OC對象的成員變量决采。

OC語法細(xì)節(jié)

1. 成員變量不能在{}中進(jìn)行初始化自沧、不能直接拿去訪問

2. 方法的聲明不能寫在@end之后

3. 方法不能當(dāng)作函數(shù)一樣調(diào)用

4. 成員變量、方法不能用static等關(guān)鍵字進(jìn)行修飾

OC方法注意點(diǎn)

方法只有聲明树瞭,沒有實(shí)現(xiàn)(經(jīng)典錯(cuò)誤拇厢,系統(tǒng)提示警告)

方法沒有聲明,只有實(shí)現(xiàn)(編譯器警告晒喷,但是可以調(diào)用孝偎,OC的弱語法)

編譯的時(shí)候,訪問沒有定義的成員變量直接報(bào)錯(cuò)凉敲,調(diào)用沒有的方法衣盾,只是警告

沒有@interface,紙偶@implemenation也可以成功定義一個(gè)類

@implemenation Dog : NSObject

{

int _age;

NSString *_name;

}

- (void)print

{

NSLog(@"The dog's name is %@,ang de it's %d years old!",_name,_age);

}

@end

@implemenation 中不能聲明和@interface一樣的成員變量

!!! OC中有BOOL基本數(shù)據(jù)類型爷抓,其值是YES和NO势决,而不是true 和false,它實(shí)際上是一種對帶符號的自負(fù)類型(signed char)的定義(typedef)蓝撇,它使用8為存儲空間果复。YES定義為1,NO定義為0渤昌;

image

類方法he實(shí)例方法

類方法

* 該方法是直接可以用類名來執(zhí)行的方法(類本身會在內(nèi)存中占據(jù)存儲空間虽抄,里面有類/對象方法列表)

* 以加號 + 開頭

* 只能用類名調(diào)用走搁,對象不能調(diào)用

* 類方法不能訪問實(shí)例變量(成員變量)

* 使用場合:當(dāng)不需要訪問成員變量時(shí),盡量使用類方法

* 類方法和對象方法可以同名

實(shí)例方法

* 該方法是用對象名來執(zhí)行的方法

* 以減號 — 開頭

* 只能用對象名調(diào)用迈窟,類不能調(diào)用私植,該方法沒有對象是不能被執(zhí)行的

* 對象方法能訪問實(shí)例變量(成員變量)

setter和getter方法

setter和getter方法的使用場合

@public的成員可以隨意被賦植,應(yīng)該使用set和get方法來管理成員變量的訪問

setter方法

作用:用來設(shè)置成員變量菠隆,可以在方法里面過濾一些不合理的值

命名規(guī)范:方法以set開頭兵琳,而且后面跟上成員變量名,成員變量名必須首字母大寫骇径,盡量形參名稱不要與成員變量名重名(成員變量名最好以下劃線 _ 開頭)

返回值:一般為void

getter方法

作用:返回對象內(nèi)部的成員變量

命名規(guī)范:方法名和成員變量名同名

返回值:一般與成員變量的類型相同

self關(guān)鍵字

成員變量和局部變量同名

當(dāng)成員變量和局部變量同名時(shí)躯肌,采取就近原則,訪問的是局部變量

當(dāng)self訪問成員變量破衔,區(qū)分同名的局部變量

使用細(xì)節(jié)

1. 出現(xiàn)的地方:所有的OC方法中(對象方法/類方法)清女,不能出現(xiàn)在函數(shù)

2. 作用:

使用“self.屬性”訪問當(dāng)前方法中的成員變量

使用“self-> 成員變量”訪問當(dāng)前方法中public成員變量

使用“[self 方法]”調(diào)用方法(類方法/實(shí)例方法)

3. 類方法中self只能調(diào)用類方法,實(shí)例方法中self只能調(diào)用實(shí)例方法

繼承

繼承的概念

1. is-a機(jī)制

2. 即當(dāng)創(chuàng)建的多個(gè)類有共同的屬性和行為時(shí)晰筛,可以抽出一個(gè)類作為父類嫡丙,在父類中定義相同的屬性,聲明實(shí)現(xiàn)相同的行為(方法)读第;

3. 子類可以使用父類的所有屬性和方法曙博,并且子類可以在父類的基礎(chǔ)上拓補(bǔ)自己的屬性和方法,包括重寫父類方法怜瞒。重寫父類方法時(shí)父泳,子類對象會優(yōu)先調(diào)用子類重寫后的方法。

4. 子類屬性和方法訪問的過程: 如果子類沒有相應(yīng)的方法或?qū)傩晕馔簦瑒t去訪問父類惠窄,一次遞進(jìn)知道找到NSObject根類,如果仍然沒有找到相對應(yīng)的方法和屬性漾橙,則報(bào)錯(cuò)杆融。

繼承的專業(yè)術(shù)語

父類/超類 superclass

子類 subclass/subclasses

繼承的細(xì)節(jié)

單繼承,不支持多繼承

子類和父類不能有相同的成員變量

子類可以重寫父類中聲明的方法(在代碼運(yùn)行時(shí)霜运,oc確保調(diào)用相應(yīng)類的重寫方的實(shí)現(xiàn))

繼承的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

在不改變原來模型的基礎(chǔ)上脾歇,拓充方法

建立了類與類的聯(lián)系

抽取了公共代碼

缺點(diǎn):

耦合性強(qiáng)

super關(guān)鍵字

super既不是參數(shù),也不是實(shí)例變量觉渴,而是oc編譯器提供的功能

用于提供一種在子類中顯示調(diào)用父類的方法

繼承的局限性

父類不能訪問子類屬性介劫、調(diào)用子類方法

不能繼承累簇(如 NSString累簇)

多態(tài)

多態(tài)的基本概念

某一類事物的多種形態(tài)

OC對象具有多態(tài)性

多態(tài)的體現(xiàn)

子類對象可以賦值給父類指針;

如:Father *f = [children new];

父類指針可以訪問對應(yīng)的屬性和方法

如: f.age = 23;

[f study];

多態(tài)的好處

用父類接收參數(shù)案淋,節(jié)省代碼

多態(tài)的局限性

不能訪問子類的屬性(可以考慮強(qiáng)制轉(zhuǎn)換)

多態(tài)的細(xì)節(jié)

動態(tài)綁定座韵,在運(yùn)行時(shí)根據(jù)對象的類型確定動態(tài)調(diào)用的方法

復(fù)合

復(fù)合包括組合和聚合

has-a機(jī)制

組合和聚合表示將各個(gè)部分組合在一起,用于表達(dá)整體與部分的關(guān)系。在面向?qū)ο蟮木幊趟枷肜镉辏褪怯靡延蓄惖膶ο蠓庋b新的類宦棺。

組合 :表示一種強(qiáng)的、嚴(yán)格的整體與部分的關(guān)系黔帕,部分和整體的生命周期一樣代咸。 比如:人和人頭

聚合 :表示一種弱的整體與部分的關(guān)系,比如: 汽車和輪胎

Foundition框架

1. OC集合只能存儲OC對象成黄,不能存儲c語言中的基本數(shù)據(jù)類型呐芥,如int,float奋岁,enum思瘟,struct,且不能在集合中存儲nil闻伶。

字符串

不可變字符串 : NSString *string1;

可變字符串 : NSMutableString *string2;

對可變字符串的操作:

2.1 增加元素

string2 appendFormat:@"hello"];

2.2 刪除元素

[string2 replaceCharacterInRange:NAMakeRange(2,3)];

2.3 修改元素(替換)

[string2 replaceCharacterInRange:NAMakeRange(2,3)withString:@"word"];

字符串的操作

3.1 比較

//判斷兩個(gè)字符串是否相等滨攻,返回的是BOOL值

[str1 isEqualTo:str2];

NSCompareResult res = [str1 copmare:str2];

不區(qū)分大小寫的比較:caseInsensitiveCompare

有選擇參數(shù)的比較: [str compare:str2 option:NSStringCompareOption]

NSStringCompareOption選項(xiàng)可以傳入的參數(shù)

enum {

NSCaseInsensitiveSearch = 1,? 不區(qū)分大小寫

NSLiteralSearch = 2,? ? ? ? ? 對于相等的字符串逐個(gè)比較

NSBackwardsSearch = 4,? ? ? 從后向前比較

NSAnchoredSearch = 8,? ? ? ? 限制比較從開始還是結(jié)尾

NSNumericSearch = 64,? ? ? ? 對于數(shù)字按數(shù)字比較

NSDiacriticInsensitiveSearch = 128,? 不區(qū)分音節(jié)

NSWidthInsensitiveSearch = 256,? ? ? 忽略full-width half-width (如 Unicode code point U+FF41 和 Unicode code point U+0061 的字母 “a”is equal)

NSForcedOrderingSearch = 512,? ? ? ? ? 對于不區(qū)分大小寫比較相等的字符串,強(qiáng)制返回NSOderedAscending or NSOrderedDeascending (如“aa” is grater than “AA”)

NSRegularExpressionSearch = 1024? ? ? ? treated as an ICU-compatible regular expression

};

NSCompareResult 有三種值:

NSOrderedSame? 兩字符串相等

NSOrderedAscending? str1 < str2

NSOrderedDeascending? str1 > str2;

3.2 求長度

NSUInteger strlen = [str1 length];

3.3 大小寫轉(zhuǎn)換

str2 = [str1 uupercaseString];

str2 = [str1 lowercaseString];

3.4 獲取文件前綴蓝翰、后綴

str2 =[str1 hasPrefix:@"word"];

str2 = [str1 hasSuffix:@"txt"];

3.5 獲取子串

//獲取str2在str1中的位置光绕,即range.location and range.length

range = [str1 rangOfString:str3];

range = [str1 rangOfString:@"hello"];

//獲取str1 第6個(gè)位置之后的字符串賦值給str2

str2 = [str1 substringFromIndex:6];

//獲取str1 從開始到第6個(gè)位置之間的字符串賦值給str2

str2 = [str1 substringTOIndex:6];

//獲取str1 從第6個(gè)位置開始長度為5的字符串賦值給str2

str2 = [str1 substringWithRange:NSMakeRange(6,7)];

3.6 文件路徑的轉(zhuǎn)換

//間文件路徑字符串str1 = @“~/test.html”的路徑轉(zhuǎn)換為絕對路徑賦值給str2

str2 = [str1 stringByExpandingTildeInPath];

//間文件路徑字符串str1 = @“/users/qingyun/test.html”的路徑轉(zhuǎn)換為相對路徑賦值給str2

str2 = [str1 stringByAbbreviatingWithTildeInPath];

3.7 文件路徑的擴(kuò)展名

str2 = [str1 pathExtension]; 此時(shí) str2 = @“html”畜份;

3.7 刪除文件路徑的后綴

str2 = [str1 stringByDeletePathExtension]; 此時(shí) str2 = @“~/test”诞帐;

3.9 追加字符串

str1 = @"hello word";

str2 = [str1 stringByAppendingFormat:@"wellcom"]; 此時(shí) str2 = @“hello word wellcom”;

數(shù)組

不可變數(shù)組 : NSArray *array1;

可變數(shù)組 : NSMutableArray *array2;

數(shù)組初始化:

NSArray *array1 = [NSArray arrayWithObjects:@"hello",@"word",@"two",nil];

NSArray *array1 = @[@12,@34,@"hello",@"error"];

//創(chuàng)建空數(shù)組

NSMutableArray *array2 = [NSMutableArray array];

//用已有的數(shù)組創(chuàng)建新數(shù)組

NSMutableArray *array2 = [NSMutableArray arrayWithArray:array];

//創(chuàng)建一個(gè)數(shù)組,并預(yù)分配內(nèi)存

NSMutableArray *array2 = [NSMutableArray arrayWithCapacity:40];

對可變數(shù)組的操作:

2.1 增加元素

[array2 addObjects:@"hello"];

2.2 刪除元素

//刪除下標(biāo)為2的對象

[array2 removeObjectsAtIndex:2];

//刪除一定范圍內(nèi)的所有@“hello”

[array2 removeObject:@"hello" inRange:NSMakeRange(2, 3)];

[array3 removeObjectIdenticalTo:@"is" inRange:NSMakeRange(1, 5)];

//刪除該數(shù)組內(nèi)的所有@“hello”

[array2 removeObjectIdenticalTo:@"hello"];

2.3 修改元素(替換)

[array2 removeObjectsAtIndex:2 withObject:@"dog"];

[array2 removeObjectsAtIndex:2 withObject:str];

[array2 removeObjectsInRange:NSMakeRang(0,2) withObjectFromArray:array];

2.4 插入元素

[array2 insertObjects:str1 AtIndex:2];

2.5 訪問數(shù)組某個(gè)對象

array2[下標(biāo)]

字典

不可變數(shù)組 : NSDictionary *dictionary1;

可變數(shù)組 : NSMutableDictionary *dictionary2;

字典初始化:

Dictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:str1,@"hello",str2,@"word",str3,@"two",nil];

Dictionary *dictionary1 = @{@"num1":@12,@"num2":@34,@"str1":@"hello",@"str2":@"error"};

//創(chuàng)建空字典

NSMutableDictionary *dictionary2 = [NSMutableDictionary dictionary];

//用已有的字典創(chuàng)建新字典

NSMutableDictionary *dictionary2 = [NSMutableDictionary dictionaryWithDictionary:array];

//創(chuàng)建一個(gè)字典爆雹,并預(yù)分配內(nèi)存

NSMutableDictionary *dictionary2 = [NSMutableDictionary dictionaryWithCapacity:40];

對可變字典的操作:

2.1 增加元素

[dictionary2 addObjects:(id)forKey:@"key"];

2.2 刪除元素

[dictionary2 removeObjectForKey:@"key"];

2.3 修改元素(替換)

[dictionary2 setObject:(id)forKey:@"key"];

2.4 訪問字典

dictionary2[@“key”];

[dictionary2 objectForKey:@"key"]

裝箱-開箱

對基本數(shù)據(jù)類型的裝箱-NSNumber

//裝箱方法1

NSNumber *number = [NSNumber numberWithChar:'X'];

NSNumber *number = [NSNumber numberWithINT:23];

NSNumber *number = [NSNumber numberWithBOOL:YES];

NSNumber *number = [NSNumber numberWithDouble:34.5];

//裝箱方法2

@23景埃,@34.5

//開箱

[number charValue];

[number intValue];

[number BOOLValue];

[number DoubleValue];

對所有非對象類型的裝箱(包括基本數(shù)據(jù)類型)- NSValue

//對NSRect,NSPoint顶别,NSRange裝箱,也可以對基本數(shù)據(jù)類型進(jìn)行裝箱

NSRect rect = NSMakeRect(10,20,30,40);

NSValue *value = [NSvalue valueWithBytes:&rect objCType:@encode(NSRect)];

int a = 5;

NSValue *value = [NSvalue valueWithBytes:&a objCType:@encode(int)];

//開箱

NSRect rect2 = {0}拒啰;

[value getValue:&rect];

int b = 0;

[value getValue:&b];

//僅對NSRect驯绎,NSPoint,NSRange裝箱

NSValue *value = [NSValue valueWithRect];

NSValue *value = [NSValue valueWithRange];

NSValue *value = [NSValue valueWithPoint];

//開箱

NSRect rect2 = {0}谋旦;

[value rectValue];

NSRange range = {0};

[value rangeValue];

NSPoint point = {0};

[value pointValue];

枚舉

//normal enumerator

NSEnumerator *enumer = [array objectEnumerator];

id obj;

while (obj = [enumer nextObject]) {

NSLog(@"%@",obj);

}

NSEnumerator *enumer2 = [array reverseObjectEnumerator];

while (obj = [enumer2 nextObject]) {

NSLog(@"%@",obj);

}

//fast enumerator

for (id obj2 in array) {

NSLog(@"%@",obj2);

}

類別

類別的簡述

為現(xiàn)有的類(自定義的類剩失、第三方的類或者是系統(tǒng)定義的類)添加一些新的行為;

類別可以解決繼承不能為累簇添加新方法的問題册着。

類別的聲明和實(shí)現(xiàn)

格式: 類名 + 類別名

如:為NSString 創(chuàng)建一個(gè)類別 NSString+NumberConvenience拴孤;

只要保證類別名稱唯一,可以向一個(gè)類中添加任意數(shù)量的類別甲捏。

聲明:

@interface NSString (NumberConvenience)

- (NSNumber *)lengthAsNumber;

@end

實(shí)現(xiàn):

@implementation NSString (NumberConvenience)

- (NSNumber *)lengthAsNumber {

}

@end

類別的優(yōu)缺點(diǎn)

缺點(diǎn):

* 只能添加方法演熟,只可以訪問原始類的實(shí)例變量,無法向類別中添加新的實(shí)例變量

* 名稱沖突。類別具有最高優(yōu)先級芒粹,即當(dāng)類別中定義與對應(yīng)類中已有的方法同名的方法兄纺,對象調(diào)用該方法時(shí),會優(yōu)先調(diào)用類別中定義的方法化漆。

* 多個(gè)Category中如果實(shí)現(xiàn)了相同的方法估脆,只有最后一個(gè)參與編譯的才會有效

優(yōu)點(diǎn):

* 將類的實(shí)現(xiàn)代碼分散到多個(gè)不同文件或框架中。

* 可以創(chuàng)建對類中私有方法的前向引用座云,

* 向?qū)ο筇砑臃钦絽f(xié)議疙赠。

使用類別實(shí)現(xiàn)類的擴(kuò)展

類的擴(kuò)展等同于在類聲明的源代碼中聲明一個(gè)無名的(即括號“ () ”里面為空)類別,并實(shí)現(xiàn)朦拖;

類的擴(kuò)展可以在源代碼中使用

可以添加實(shí)例變量作為類的私有變量和方法

可以將只讀權(quán)限改為讀寫權(quán)限

創(chuàng)建數(shù)量不限

利用類別分散實(shí)現(xiàn)代碼的優(yōu)點(diǎn)

. 在大型的項(xiàng)目中圃阳, 一個(gè)類的實(shí)現(xiàn)可能非常大,并且.m文件不能分離贞谓。但是使用類別可以將一個(gè)類的實(shí)現(xiàn)分散且有規(guī)律的組織在不同的文件中限佩。還可以將一個(gè)類的實(shí)現(xiàn)分散到不同的框架中。

. 編程人員可以更加容易閱讀代碼并實(shí)現(xiàn)多人合作編碼

. 版本管理降低沖突

. 維護(hù)人員更容易理解代碼

非常正式協(xié)議

非正式協(xié)議就是為NSObject類創(chuàng)建一個(gè)類別裸弦;

響應(yīng)選擇器

使用@selector()編譯指令來指定選擇器,圓括號里是具體的方法名祟同。如:

@selector(setEngine:)

@selector(setTire:atIndex)

選擇器的類型關(guān)鍵字:SEL

(BOOL)respondsToSelector:(SEL)@Selector; 使用此方法可以判斷某一對象是否可以執(zhí)行指定的方法。

QYStudent *student = [[QYStudent alloc]init];

如: [student respondToSelector:(SEL)@selector(study)];

協(xié)議

基本用途

可以用來聲明一大堆方法(不能聲明成員變量)

只要某個(gè)類遵守了這個(gè)協(xié)議理疙,就相當(dāng)于擁有這個(gè)協(xié)議中的所有方法聲明

只要父類遵守了某個(gè)協(xié)議晕城,就相當(dāng)于子類也遵守了

格式 @protocol 協(xié)議名

方法聲明列表

@end

某個(gè)類遵守某個(gè)協(xié)議

@interface 類名 : 父類名<協(xié)議名>

@end

關(guān)鍵字

協(xié)議中有2個(gè)關(guān)鍵字可以控制方法是否要實(shí)現(xiàn)(默認(rèn)是@required),在大多數(shù)情況下窖贤,用途在于程序員之間的交流

@required: 該關(guān)鍵字以下且@optional關(guān)鍵字以上的方法必須要實(shí)現(xiàn)(若不實(shí)現(xiàn)砖顷,編譯器會發(fā)出警告

@optional: 該關(guān)鍵字以下且@required關(guān)鍵字以上的方法可以選擇性的實(shí)現(xiàn)

協(xié)議遵守協(xié)議

一個(gè)協(xié)議可以遵守其他多個(gè)協(xié)議,多個(gè)協(xié)議之間用逗號 , 隔開

一個(gè)協(xié)議遵守了其他協(xié)議赃梧,就相當(dāng)于擁有了其他協(xié)議中的方法聲明

@protocol 協(xié)議名稱 <協(xié)議1, 協(xié)議2>

@end

基協(xié)議

NSObject是一個(gè)基類滤蝠,最根本最基本的類,任何其他類最終都要繼承它

其實(shí)還有一個(gè)協(xié)議授嘀,名字也叫NSObject物咳,它是一個(gè)基協(xié)議,最根本最基本的協(xié)議

NSObject協(xié)議中聲明很多最基本的方法蹄皱,比如description览闰、retain、release等

建議每個(gè)新的協(xié)議都要遵守NSObject協(xié)議

定義變量時(shí)指定協(xié)議

// NSObject類型的對象巷折,并且要遵守NSCopying協(xié)議

NSObject *obj;

// 任何OC對象压鉴,并且要遵守NSCoding協(xié)議

id obj2;

內(nèi)存管理

內(nèi)存管理機(jī)制:引用計(jì)數(shù)

引用計(jì)數(shù)的計(jì)算

alloc 、new 锻拘、copy(copy生成接收對象的一個(gè)副本) //使用這三個(gè)方法創(chuàng)建對象時(shí)油吭,對象的引用計(jì)數(shù)器為1

(id) retain; //給對象發(fā)送retain消息后,對象的引用計(jì)數(shù)器加1

(void) release; //給對像發(fā)送release消息后,對象的引用計(jì)數(shù)器減1

-(void)dealloc; //當(dāng)一個(gè)對象的引用計(jì)數(shù)器變?yōu)?而即將被銷毀時(shí),Objective-C自動向?qū)?象發(fā)送一條dealloc消息上鞠,我們通常都會在自己的對象中重寫dealloc方法

(unsigned) retainCount;//獲取當(dāng)前對象的引用計(jì)數(shù)器的值

非ARC環(huán)境下內(nèi)存的管理

當(dāng)某個(gè)對象被持有有际邻,[對象名 retain]; 當(dāng)某個(gè)對象不再被持有時(shí)芍阎,[對象名 release]世曾;

ARC環(huán)境下內(nèi)存的管理

規(guī)則

只要還有一個(gè)強(qiáng)指針變量指向?qū)ο螅瑢ο缶蜁3衷趦?nèi)存中

強(qiáng)引用谴咸,弱引用

? 默認(rèn)所有實(shí)例變量和局部變量都是Strong指針

? 弱指針指向的對象被回收后轮听,弱指針會自動變?yōu)閚il指針,不會引發(fā)野指針錯(cuò)誤岭佳。其修飾符號為__weak;

注意點(diǎn)

? 不能調(diào)用release血巍、retain、autorelease珊随、retainCount

? 可以重寫dealloc述寡,但是不能調(diào)用[super dealloc]

? @property : 想長期擁有某個(gè)對象,應(yīng)該用strong叶洞,其他對象用weak

? 其他基本數(shù)據(jù)類型依然用assign

? 兩端互相引用時(shí)鲫凶,一端用strong衩辟、一端用weak

自動釋放池

自動釋放池是一個(gè)存放實(shí)體的集合螟炫,這些實(shí)體可能是對象艺晴,這些對象能夠被自動釋放。

/ - (id) autorelease; //是NSObject類提供的方法封寞,此方法在某一個(gè)預(yù)定的時(shí)候然评,向?qū)ο蟀l(fā)送release消息狈究,返回值是接收消息的對象沾瓦。實(shí)際上當(dāng)給一個(gè)對象發(fā)送autorelease消息的時(shí)候,就是將這個(gè)對象添加到的自動釋放池(NSAutoreleasePool)中,當(dāng)自動釋放池銷毀時(shí)孙咪,會向該池中的所有對象發(fā)送release消息樊破。

如: - (NSString ) description

{

NSString desc;

desc = [[NSString alloc] initWithFormat: @” I am %d years old”,29];

return ([desc autorelease]);

}

內(nèi)存管理規(guī)則

如果我使用了new , alloc 或者copy方法獲得一個(gè)對象,則我必須釋放或自釋放該對象还蹲。

如果你對對象調(diào)用了retain消息,那么你必須負(fù)責(zé)釋放(release)這個(gè)對象谜喊,保證retain和release的使用次數(shù)相等。

拷貝

淺拷貝(shallow copy)

不會復(fù)制所引用的對象山卦,新復(fù)制的對象只會指向現(xiàn)有的引用對象上。(引用計(jì)數(shù)加 1 账蓉,地址不變)

深拷貝(deep copy)

真正意義的復(fù)制概念逾一。得到的結(jié)果是多個(gè)铸本,而非只是對象的引用遵堵。(引用計(jì)數(shù) 不變 ,地址發(fā)生變化)

關(guān)鍵字

copy:對不可變的集合copy為淺拷貝锡足,對可變的集合copy為深拷貝

mutableCopy:對可變的或不可變的集合mutableCopy都是深拷貝限番,但是對于集合內(nèi)部對象的拷貝時(shí)淺拷貝。

BLOCK

基本概念

代碼塊本質(zhì)上是和其他變量類似弥虐。不同的是,代碼塊存儲的數(shù)據(jù)是一個(gè)函數(shù)體霜瘪。使用代碼塊時(shí),可以像調(diào)用其他標(biāo)準(zhǔn)函數(shù)一樣捻撑,傳入?yún)?shù)數(shù)缤底,并得到返回值。

Block封裝了一段代碼,可以在任何時(shí)候執(zhí)行

Block可以作為函數(shù)參數(shù)或者函數(shù)的返回值个唧,而其本身又可以帶輸入?yún)?shù)或返回值。

蘋果官方建議盡量多用block徙歼。在多線程鳖枕、異步任務(wù)桨螺、集合遍歷、集合排序灭翔、動畫轉(zhuǎn)場用的很多

定義

int (^MySum)(int, int) = ^(int a, int b) {

return a+b;

};

定義了一個(gè)叫MySum的blocks對象魏烫,它帶有兩個(gè)int參數(shù),返回int则奥。等式右邊就是blocks的具體實(shí)現(xiàn)

對變量的訪問權(quán)限

對全局變量具有讀寫權(quán)限

對靜態(tài)變量具有讀寫權(quán)限

對局部變量只有訪問權(quán)限(可以用__block修飾局部變量狭园,這樣可以對其進(jìn)行修改)

與函數(shù)指針的對比

定義函數(shù)指針

int (*p)(int,int);

定義Blocks

int (^Blocks)(int,int);

調(diào)用函數(shù)指針

(*p)(10, 20);

調(diào)用Blocks

Blocks(10, 20);

typedef和賦值

在聲明的同時(shí)定義變量,然后賦值

int (^MySum)(int,int) = ^(int a,int b) {

return a + b;

};

也可先用typedef先聲明類型唱矛,再定義變量進(jìn)行賦值

typedef int (^MySum)(int,int);

MySum sum = ^(int a,int b) {

return a + b;

};

KVC(Key Valuble Coding)

基本概念

是一種間接更改對象狀態(tài)(或者說是屬性值)的方式:key-value coding 簡稱KVC.

主要本質(zhì)特點(diǎn)是采用字符串來標(biāo)識對象的屬性變量,并可以利用這個(gè)標(biāo)識來更改對象的狀態(tài)(或者說是屬性值)

基本用法

(id)valueForKey:(NSString *)key //以key作為標(biāo)識符管闷,獲取其對應(yīng)的屬性值

(void)setValue:(id)value forKey:(NSString *)key //以key作為標(biāo)識符設(shè)置其對應(yīng)的屬性值。

調(diào)用機(jī)制

valueForKey:會首先查找以參數(shù)名命名(格式為-key或者isKey)的getter方法窃肠,如果找到的話則調(diào)用這個(gè)方法包个;如果沒有找到這樣的getter方法,它將會在對象內(nèi)部尋找名稱格式為_key或者key的實(shí)例變量冤留,然后返回。

setValue:forKey:的機(jī)制跟valueForKey相似纤怒。它首先查找參數(shù)名命名的setter方法,如果找到的話則完成設(shè)置熄驼;如果沒有找到setter方法烘豹, 則直接在類中找到名稱格式為_key或者key的實(shí)例變量, 然后將value賦值給它携悯。

鍵路徑

鍵路徑的概念和表示:可以在對象和不同的變量名稱之間用圓點(diǎn)分開來表示。

-(id)valueForKeyPath:(NSString *)keyPath //以keyPath作為標(biāo)識符实束,獲取其對應(yīng)的屬性值

-(void)setValue:(id)value forKeyPath:(NSString *)keyPath //以keyPath為標(biāo)識符逊彭,設(shè)置其對應(yīng)的屬性的值。

謂詞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末避矢,一起剝皮案震驚了整個(gè)濱河市囊榜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸勺,老刑警劉巖曙求,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悟狱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)苹享,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門浴麻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椭赋,你說我怎么就攤上這事或杠。” “怎么了认境?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵挟鸠,是天一觀的道長。 經(jīng)常有香客問我艘希,道長硅急,這世上最難降的妖魔是什么佳遂? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任丑罪,我火速辦了婚禮,結(jié)果婚禮上吩屹,老公的妹妹穿的比我還像新娘。我一直安慰自己免绿,他們只是感情好宅楞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著距淫,像睡著了一般婶希。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喻杈,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天筒饰,我揣著相機(jī)與錄音,去河邊找鬼瓷们。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碘裕,可吹牛的內(nèi)容都是我干的攒钳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼文兢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姆坚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萍程,沒想到半個(gè)月后兔仰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乎赴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年榕吼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羹蚣。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顽素,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胁出,到底是詐尸還是另有隱情,我是刑警寧澤闹蒜,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布裸诽,位于F島的核電站,受9級特大地震影響丈冬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜往弓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望槐脏。 院中可真熱鬧撇寞,春花似錦、人聲如沸蔑担。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排抬。三九已至,卻和暖如春蹲蒲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背对室。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工咖祭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牺汤。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓浩嫌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親码耐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用敦间,...
    LZM輪回閱讀 3,310評論 0 6
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,139評論 30 470
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,354評論 0 35
  • 國慶以前就預(yù)定好了的安居馬房小學(xué)送教活動厢绝,就在今天開展。 我講的是認(rèn)識時(shí)間昔汉,之前在我們學(xué)校試講過兩次拴清,后來又去本部...
    無葉麥拉蘇閱讀 97評論 0 0
  • 【今早起床】5點(diǎn)20【清晨功課】靜坐與祈禱【家務(wù)檢視】保持干凈,物品及時(shí)歸位【健康運(yùn)動】堅(jiān)持6杯水嫡秕、跑步苹威、火呼吸 ...
    心靜若水1閱讀 158評論 0 0