您好,登錄后才能下訂單哦!
1.類和對象
面向過程編程(Procedure oriented Programming, POP):以事件為中心,關心完成該事件的詳細步驟,一步一步如何實現
面向對象編程(Object Oriented Programming, OOP):以事物為中心,也就是參數事件的參與者,設計事物的功能,而完成事物只是事物的所有功能中的一個小功能
類:具有相同特征 和 相同行為的 事物的抽象
類是一個抽象的概念,在生活不具體
描述一個類:通過 特征(靜態屬性) 以及 行為(動態屬性,動作)
對象:是類的實例,也就是類的具體表現,視具體的,生活中的萬物都是對象
OC中方法的調用,采用消息發送機制
[receiver message] receiver :消息的接受者,類或者對象 message :消息也就是OC的方法
類的定義分為兩部分:
(1)類的接口部分:提供外部訪問的借口,相當于使用說明書,寫在.h文件中.
a.以 @interface 開頭,以 @end 結束,只有把類的接口定義內容寫在開始和結束之間才有效
b.實例變量必須寫在大括號之內,而且大括號只能寫在實例變量
(2)類的實現部分:相當于功能的實現,寫在.m文件中.
a.@implementation 開頭 @end 結束,實現內容必須寫在中間才有效
b.@implementation 后的 Person 是要實現的類(需要指定要對哪一個類做實現)
.m.h文件和類沒有直接關系,文件中可以存放多個類,要類符合接口部分以及實現部分的定義格式就可以了
一般情況下,一個文件就定義一個類,而且文件的名字和類的名字一樣,這樣就能清晰的知道該文件中的類的名字
2.自定義初始化,setter方法,getter方法,實例變量的可見度
實例變量的可見度:
(1) @public:公共的,在任何文件中都可以訪問
(2)@protected:受保護的,有一定的訪問權限,只允許在本類文件以及子類文件中訪問,其他文件不可以訪問
(3)@private:私有的,只允許在本類文件中訪問,不可以在子類文件 以及其他文件中訪問
系統默認的可見度是@protected
自定義初始化
- (id)initWithBrand:(NSString *)brand; - (id)initWithBrand:(NSString *)brand { _brand = brand; return self; }
setter方法
- (void)setBrand:(NSString *)brand; - (void)setBrand:(NSString *)brand { _brand = brand; }
getter方法
- (NSString *)brand; - (NSString *)brand { return _brand; }
3.NSString和NSMutableString
(1)創建對象
a.便利構造器(+號方法)
NSString *str1 = [NSString stringWithFormat:@"iPhone%d", 5];
b.alloc+初始化方法
NSString *str2 = [[NSString alloc] initWithFormat:@"iPhone%d", 4];
length方法 求字符串長度
NSUInteger length = [str1 length];
characterAtIndex:方法 獲取字符串中的某個字符
判斷是否以指定的字符串開頭(hasPrefix:方法),或者以指定的字符串結尾(hasSuffix:)
rangeOfString:方法 查找指定字符串的范圍
字符串截取(獲取子字符串) substringFromIndex:方法 和 substringToIndex:方法
獲取指定范圍內的字符串 substringWithRange:方法
字符串拼接 stringByAppendingString:方法
替換字符串 stringByReplacingOccurrencesOfString:方法 和stringByReplacingCharactersInRange:withString:方法
字符串比較 compare:方法
字符串大小寫 uppercaseString方法 lowercaseString方法 capitalizedString方法
appendFormat:方法 deleteCharactersInRange:方法 insertString:atIndex:方法 replaceCharactersInRange:withString:方法
4.NSArray和NSMutableArray
arrayWithObjects:方法
count方法
objectAtIndex:方法
firstObject方法
lastObject方法
indexOfObject:方法
containsObject:方法
sortedArrayUsingSelector:方法
NSArray *sortArr = [arr2 sortedArrayUsingSelector:@selector(compare:)];
forin快速枚舉
for (NSString *str in arr2) { NSLog(@"%@", str); }
addObject:方法
removeObjectAtIndex:方法
removeAllObjects方法
replaceObjectAtIndex:withObject:方法
exchangeObjectAtIndex:withObjectAtIndex:方法
sortUsingSelector:方法
[arr1 sortUsingSelector:@selector(compare:)];
重寫從父類繼承的方法description
當打印該類的對象時,系統會自動調用該方法
- (NSString *)description { //%g可以負略掉無用的零0 return [NSString stringWithFormat:@"name:%@ price:%g", _name, _price]; }
5.NSDictionary和NSMutableDictionary
dictionaryWithObjectsAndKeys:nil方法 initWithObjectsAndKeys:nil方法 創建對象
allKeys方法 獲所有的key
objectForKey:方法 根據key獲取對應的value
removeObjectForKey:方法 刪除元素
setObject:forKey:方法 添加元素或修改key對應的value
先根據指定的key查找字典中是否存在相同的key,(查找字典中的是否存在指定的key) 如果存在,則修改key對應的value,如果不存在,在字典中添加一個元素,key-value鍵值對
5.NSSet和 NSMutableSet
anyObject方法 獲取集合中的某個元素
containsObject:方法 判斷集合中是否包含某個對象
setWithObjects:nil方法 設置集合
removeObject:方法 移除元素
6.block
int (^block)(int x, int y) = ^(int x, int y) { return x + y; }; 當把函數的實現賦給block變量之后,block變量就可以當做函數名使用
當在block內部使用block外部定義的(局部變量)時,如果 變量沒有被__block修飾, 則在block內部是readonly(只讀的),不能對它修改,如果想修改,變量前必須要有__block修飾
__block的作用告訴編譯器,編譯時在block內部不要把外部變量當做常量使用,還是當做變量使用
如果在block中訪問全局變量,就不需要__block修飾
7.屬性和點語法
用來替代setter以及getter方法,使用屬性可以快速創建setter以及getter方法的聲明,setter以及getter方法的實現,另外還添加了對實例變量操作的安全處理
@property只是自動聲明setter以及getter方法的聲明
@synthesize 屬性的實現部分,實現屬性自動生成的setter以及getter方法
如果將@synthesize省略,并且我們自己實現setter以及getter方法時,系統不會生成對應setter以及getter,還有實例變量
屬性的特性
第一大特性:讀寫特性
(1)readonly:告訴編譯器,屬性在自動生成方法時,只會生成getter方法,不會生成setter方法
(2)readwrite:告訴編譯器,屬性在自動生成方法時,即要生成setter方法,也要生成getter方法,系統默認的讀寫特寫
(3)setter = aa: 告訴編譯器,當自動生成setter方法時,setter方法的方法名為指定的名字aa:,不采用默認的
(4)getter = bb 告訴編譯器,當自動生成getter方法時,getter方法的名字為指定的名字bb,不采用默認的
第二大特性:原子性特性
(1)atomic:原子特性,保證線程安全,內部做了安全處理(加鎖與解鎖),系統默認的原子特性
(2)nonatomic:非原子特性,不保證線程安全,因為對于setter以及getter方法的使用,比較頻繁,在一段時間內可能要多次訪問,所以使用atomic會非常消耗系統的資源,降低程序的執行效率,使用nonatomic雖然不保證線程安全,但是使用一般情況下都是安全的,所以對于原子特性,使用nonatomic
第三大特性:語義特性
(1)assign : 直接賦值,使用針對于基本數據類型,也可針對于對象類型,系統默認的語義特性
(2)copy : 針對于對象類型,并且要服從NSCopying協議的對象才可以 會復制出一個新的對象,擁有新的對象的所有權,(引用計數+1) (先暫時這么理解)
(3)retain : 針對于對象類型,會造成對象的引用計數+1,
點語法,是一種快速訪問setter以及getter方法的方式,聲明屬性默認生成對應的setter以及getter方法,所以屬性和setter和getter方法都關聯
對象.屬性名 ---如果在等號的左邊,意味著調用setter方法,除此情況,都是調用getter方法
8.NSDate和NSDateFormatter
date方法 獲取當前時間
dateWithTimeIntervalSinceNow:方法
timeIntervalSinceDate:方法
earlierDate:yesterdayDate方法 獲得兩個日期中較早的日期
laterDate:yesterdayDate方法 獲得兩個日期中較晚的日期
compare:方法 兩個日期比較
setDateFormat:方法
setDateStyle:方法
stringFromDate:方法
9.分類 協議 延展
分類,類目,category
目的 是為沒有源代碼的類添加方法,(只能添加方法,不能添加實例變量)
是擴充一個類的功能方式之一,為原有類擴充得方法會成為原類得一部分,使用即可
分類也分為.h(接口部分) 以及.m(實現部分)
協議 相當于一個任務清單,規定了要做的操作(只有一系列方法得聲明), 誰服從該協議,誰就要實現該協議中的方法.(完成任務清單)所以協議只有.h文件,沒有.m文件
<> 表示服從協議,服從的協議寫在<>之內
代理的語義特性為assign
@optional 可選的, 被他修飾的方法服從協議的類可以選擇實現(可以實現,也可以不實現)
@required 必須的, 被他修飾的方法服從協議的類必須選擇實現(沒有商量的余地)
延展 也是擴充類得的功能的一種方式,只不過延展擴充的內容是私有的,是在.m文件中定義的
延展即可以擴展方法也可以擴展實例變量,只不過都是私有的,外界無法直接訪問
延展是為有源代碼的類擴充內容 (Extension)
10.內存管理
內存管理基本原則:
如果你對一個對象進行alloc retain copy之后,你就擁有了該對象的所有權,你就必須對它進行release或者autorelease
內存問題:野指針異常 內存泄露
autorelease 會將聲明為autorelease的對象放入離他最近的自動釋放池中,當自動釋放池銷毀時,回向池中的每一個對象發送一個release消息
當該類的對象引用計數為0時,系統會自動調用該類的dealloc方法來回收空間,該方法是由系統自動調用,不能手動調用
驗證對象空間有沒有回收,只要查看該類的dealloc方法有沒有執行即可
屬性的內存管理
//setter getter 方法,內部是對實例變量賦值以及實例變量的屈指操作,所以方法內要操作實例變量 - (void)setTea:(Teacher *)tea { //判斷原有對象和新對象是否是同一個,如果是同一個,就沒有必要再重新賦值,否則 會先release, release之后空間被系統回收,此時再retain就成野指針問題了 if (_tea != tea) { [_tea release]; //釋放保有的之前對象的所有權 //讓實例變量保有新的對象的所有權 _tea = [tea retain]; } } //語義特性為copy,setter方法內部實現 - (void)setTea1:(Teacher *)tea1 { if (_tea1 != tea1) { [_tea1 release]; //如果相對一個對象進行copy操作,對象的類必須服從一個NSCopying協議,并且實現協議中的方法 _tea1 = [tea1 copy]; } } - (void)dealloc { //當該類對象的引用計數為0時,會自動調用該類的dealloc方法 //當調用dealloc方法時,該對象的空間將要被系統回收,在空間回收之前,將保有的其他對象的所有權釋放掉 [_tea release]; [_tea1 release]; [super dealloc]; }
便利構造器的內存管理
+ (id)teacherWithName:(NSString *)name Gender:(NSString *)gender { Teacher *teacher = [[Teacher alloc] initWithName:name Gender:gender]; return [teacher autorelease]; }
collocation 的內存管理
當把一個對象放在一個集合(數組,字典,集合)中時,會將對象的引用計數 +1,因為內部做了retain操作
當collocation(數組,字典,集合) 空間被回收時,他們會向容器中的每一個元素都發送一個release消息(對應添加元素時的retain操作)
當從collocation(數組,字典,集合)中移除一個元素時,會release該對象,引用計數-1
11.KVC
KVC : key-value-coding 鍵值編碼 是一種間接訪問實例變量的方式,通過指定的key來找到對應的實例變量(切記:key是字符串)
KVC的工作原理:根據指定的key,比如:name
(1)先查找該類是否有對應setter方法:比如setName:如果有,則通過setter方法給實例變量賦值,如果沒有,則轉到(2)
(2)查找該類有沒有一個_+key的實例變量,比如_name,如果有,則給_name賦值,如果沒有則轉到(3)
(3)查找該類是否具有一個和key同名的實例變量,比如name,如果有,則給name賦值,如果沒有,則轉到(4)
(4)如果都沒有找到,系統會拋出一個NSUnknownKeyException,說明沒有找到可匹配的key,(也就是該類既沒有setName:,也沒有_name,也沒有name)
setValue:forKey:方法
setValue:forKeyPath:方法
setValuesForKeysWithDictionary:方法
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。