前言
專(zhuān)注、堅(jiān)持,是優(yōu)良的品格。
正文
1、cell和cell.contentView 的區(qū)別
在給UITableViewCell添加視圖的時(shí)候,我們有以下兩種做法:
[cell addSubview: subView][cell.contentView addSubview: subView]
有何不同?
先看看以下兩個(gè)tableView模式的視圖結(jié)構(gòu):


[cell addSubview: subView]添加的subView,不會(huì)隨著模式改變而改變位置;
2、Block修改外部變量
先看看一段簡(jiǎn)單的代碼,看看NSLog會(huì)輸出什么?代碼是否存在問(wèn)題?
typedef void(^TestBlock)();
@implementation ViewController {
int a;
NSString *b;
}
- (void)viewDidLoad {
[super viewDidLoad];
a = 0;
b = @"0";
int c = 0;
TestBlock block = ^() {
a = 100;
b = @"100";
c = 100;
};
block();
NSLog(@"%d %@ %d", a, b, c);
}
問(wèn)題1:在Block中修改棧內(nèi)臨時(shí)變量,需要添加__block關(guān)鍵字聲明;
問(wèn)題2:在Block中修改@implementation 中聲明的屬性變量,也需要添加Weak-Strong的聲明;
Block的執(zhí)行時(shí)機(jī)未定,所以無(wú)法直接修改棧內(nèi)臨時(shí)變量;如果發(fā)現(xiàn)在棧外調(diào)用,會(huì)觸發(fā)指針異常;故而需要添加
__block聲明,使用時(shí)把變量copy到堆上;
同理,Block可能會(huì)在VC的聲明周期之外執(zhí)行,所以需要在block外面添加weakSelf的聲明,避免Block強(qiáng)引用self導(dǎo)致VC無(wú)法回收;同時(shí)在Block內(nèi)部添加StrongSelf的聲明,避免Block在執(zhí)行過(guò)程中VC被回收;
在Block內(nèi)外添加NSLog(@"%p %p %p", &a, &b, &c);,可以而查看調(diào)用前后的地址變化;
如果還想深入了解,可以入手一本《Objective-C高級(jí)編程 iOS與OS X多線程和內(nèi)存管理》

3、多參數(shù)方法的調(diào)用
通過(guò)performSelector無(wú)法調(diào)用一個(gè)多參數(shù)的方法,可以使用NSInvocation。
首先通過(guò)instanceMethodSignatureForSelector獲取NSMethodSignature,再通過(guò)invocationWithMethodSignature新建NSInvocation,最后設(shè)置好target和selector以及參數(shù)數(shù)組,最后調(diào)用invoke。
You should use the invocationWithMethodSignature: class method to create NSInvocation objects; you should not create these objects using alloc and init.
不會(huì)對(duì)參數(shù)進(jìn)行retain操作,開(kāi)發(fā)者要保證調(diào)用期間的參數(shù)生命周期。
這種調(diào)用方式比較復(fù)雜,如果能修改被調(diào)用的方法,可以采用把參數(shù)設(shè)置成NSDictionary或者自定義的數(shù)據(jù)結(jié)構(gòu)體;也可以把方法的調(diào)用采用Block的方式。
4、Xcode 無(wú)法在Debug中輸出變量信息
Xcode在真機(jī)調(diào)試時(shí),無(wú)法通過(guò)LLDB指令打印變量信息,得到的錯(cuò)誤信息是:
Errored out in Execute, couldn't PrepareToExecuteJITExpression
- 可能1、工程編譯目標(biāo)類(lèi)型是release而不是debug,在target設(shè)置中改為debug;
- 可能2、Xcode和iOS版本不一致,對(duì)齊版本;
- 可能3、系統(tǒng)問(wèn)題,重啟電腦和iOS;
- 可能4、打開(kāi)schemes,Run選項(xiàng),關(guān)閉Address Sanitizer;
5、Xcode 內(nèi)存暴漲
Xcode8內(nèi)存占用暴漲到60G,同時(shí)SVN占用7G多;

這個(gè)狀況在今年使用SVN同步代碼之后首次出現(xiàn),因?yàn)镾VN拉取最新的代碼后Xcode會(huì)進(jìn)行Index操作,懷疑是svn進(jìn)程異常導(dǎo)致Xcode的Index邏輯異常。
在GG上查找多次,沒(méi)有找到類(lèi)似的問(wèn)題的解決方案。
最后自己的解決辦法是:打開(kāi)Xcode的偏好設(shè)置,選擇Account,刪除Repo下面的svn庫(kù),命令行執(zhí)行一遍svn cleanup,重新添加svn的Repo。
6、Core Data 真機(jī)數(shù)據(jù)查看
工作需要,想查看真機(jī)上面的CoreData的數(shù)據(jù)庫(kù)數(shù)據(jù)。
真機(jī)聯(lián)Xcode,打開(kāi)Xcode的Devices(Shift+Command+2),下載對(duì)應(yīng)App的沙盒數(shù)據(jù)。找到CoreData對(duì)應(yīng)的數(shù)據(jù)庫(kù)文件,一般是ProjectName.sqlite。
AppStore下載SQLPro for SQLite Read_Only,然后用其查看。
CodeReview
代碼寫(xiě)的好不好,幾個(gè)評(píng)判標(biāo)準(zhǔn):
1、穩(wěn)健性;
2、擴(kuò)展性;
3、可讀性;
總結(jié)一起就是,異常分支有處理,同事閱讀方便,增改邏輯便捷;
**
一個(gè)對(duì)象中私有方法和公有方法的涇渭分明,并且按照具體的功能模塊進(jìn)行聚合,用category離散化代碼;**
善用繼承機(jī)制,每個(gè)VC都要有通用的VC以方便后期的統(tǒng)一處理;
Notification的聲明中,要注明發(fā)起時(shí)機(jī),發(fā)送/接受者,參數(shù)定義;
一個(gè)單例類(lèi)如果在使用中存在狀態(tài),多數(shù)情況是多個(gè)分支入口調(diào)用異步操作,如下

這種情況,最好使用閉包的回調(diào)機(jī)制,而不是采用狀態(tài)。(因?yàn)閱蝹€(gè)狀態(tài)在多次調(diào)用過(guò)程中會(huì)被重置,多個(gè)狀態(tài)邏輯混亂)
總結(jié)
在過(guò)去的一段時(shí)間里,學(xué)習(xí)新的工作制度,?融入新的環(huán)境。
一個(gè)擁有優(yōu)秀的學(xué)習(xí)方法和自我控制能力的人,在每個(gè)行業(yè)都能煥發(fā)出自己的光彩。