iOS開(kāi)發(fā)筆記(六)

前言

專(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ā)出自己的光彩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容