
第一章
1.運(yùn)行時(shí)語言:在編譯的時(shí)候不能直接編譯成機(jī)器可讀的語言,而是在運(yùn)行時(shí)(runtime)把程序編譯成機(jī)器可讀的語言。OC就是一門動態(tài)語言、c++為靜態(tài)語言
2.盡量減少頭文件的引用,這樣可以提高編譯速度
3.盡量少使用#define
正確
static NSString *const Name = @"CF";
static const CGFloat Height = 1.80;
錯(cuò)誤
#define Name @"CF"
#define Height = 1.80
5.返回值不確定時(shí)使用instancetype 而不是用id
第五章
33.在一個(gè)類中也可以創(chuàng)建不同的類,這樣可以免去創(chuàng)建類似的類,而是用一個(gè)類,在類的里面再去常見其他的類即可。
***.h文件 ***
#import <Foundation/Foundation.h>
@interface Catagory : NSObject
@property (nonatomic,copy) NSString *ss;
-(void)eat;
@end
@interface CatagoryOne : NSObject
@property (nonatomic,copy) NSString *oneName;
-(void)eat;
@end
@interface CatagoryTwo : NSObject
@property (nonatomic,copy) NSString *twoName;
-(void)eat;
@end
.m文件
#import "Catagory.h"
@implementation Catagory
-(void)eat{
NSLog(@"Catagory eat");
}
@end
@implementation CatagoryOne
-(void)eat{
NSLog(@"CatagoryOne eat");
}
@end
@implementation CatagoryTwo
-(void)eat{
NSLog(@"CatagoryTwo eat");
}
@end
只需要引用一個(gè)#import "Catagory.h"里面的CatagoryOne 和 CatagoryTwo 就都可以使用了
注意這樣的優(yōu)點(diǎn)是把有同樣邏輯和功能的類放在一起,不需要再去單獨(dú)的拆分,如果兩個(gè)類的邏輯并不一樣,那么久不要放在一起。
34.在我們獲取一個(gè)對象的時(shí)候,可以先進(jìn)行一些判斷,例如這個(gè)對象確認(rèn)是某個(gè)類,或者是否是有值的,之后再去進(jìn)行一些操作,這樣可以提高代碼的健壯性,不會以為拿到的類,類型不對崩潰,會因?yàn)橐詾橛兄?,?shí)際是沒有值的崩潰問題。
36.一個(gè)對象調(diào)用new方法的時(shí)候,做了兩步操作,第一步:創(chuàng)建對象的內(nèi)存,第二步:調(diào)用對象的init方法
38.block代碼塊里面使用self會出現(xiàn)循環(huán)引用無法釋放的問題, 應(yīng)該在block之前改成弱引用
_weak ClassName *weakself = self;
39.OC中所有對象之間的交互都是通過指針來改變的。
40.當(dāng)一個(gè)對象至nil時(shí),如果沒有其他對象強(qiáng)引用就會被釋放。
第六章
41.在OC中每個(gè)對象都隱藏著一個(gè)數(shù)據(jù)結(jié)構(gòu)指針isa指針。在OC中每個(gè)對象都保留一個(gè)超類指針,通過該指針可以調(diào)度自己已有的方法和調(diào)度基類。
注:沒有寫的建議,個(gè)人認(rèn)為是老的,或者是大家都知道,所有沒有提及,只寫了個(gè)人認(rèn)為要注意的。
小伙伴們?nèi)绻J(rèn)為還有其他要注意的,請留言,我會添加上去。