溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

由UISearchBar引起的lldb調(diào)試

發(fā)布時(shí)間:2020-06-07 20:27:31 來源:網(wǎng)絡(luò) 閱讀:673 作者:zmhot88 欄目:移動(dòng)開發(fā)

       iOS6,7中UISearchBar內(nèi)部的view布局已經(jīng)完全不一樣。如圖:

由UISearchBar引起的lldb調(diào)試


由UISearchBar引起的lldb調(diào)試

       

上面是iOS6的,下面是iOS7的,對(duì)應(yīng)的去除UISearchBar的背景色和添加其中的UITextField的代碼也不一樣。如下:

//搜索框
UISearchBar *sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(83, 6, 230, 31)];
sBar.placeholder = @"請(qǐng)選擇類型后輸入關(guān)鍵字";
sBar.delegate = self;
sBar.barStyle = UIBarStyleDefault;
if ([sBar respondsToSelector:@selector(barTintColor)]) {
    [sBar setBarTintColor:[UIColor clearColor]];
    UIView *searchview = [sBar.subviews objectAtIndex:0];
    for (UIView *view in searchview.subviews){
        if ([view isKindOfClass: [UITextField class]]) {
            UITextField *tf = (UITextField *)view;
            tf.clearButtonMode = UITextFieldViewModeWhileEditing;
            tf.borderStyle = UITextBorderStyleNone;
            tf.background = [[UIImage p_w_picpathNamed:@"bg_searchbox.png"] stretchableImageWithLeftCapWidth:20 topCapHeight:0];
            tf.leftView = nil;
            break;
        }
    }
                                                                                                                                                                  
    [_typeBtn setImageEdgeInsets:UIEdgeInsetsMake(0, 2, 0, -65)];
}
else{
    [[sBar.subviews objectAtIndex:0] removeFromSuperview];
    [sBar setBackgroundColor:[UIColor clearColor]];
                                                                                                                                                                  
    for (UIView *view in sBar.subviews){
        if ([view isKindOfClass: [UITextField class]]) {
            UITextField *tf = (UITextField *)view;
            tf.clearButtonMode = UITextFieldViewModeWhileEditing;
            tf.borderStyle = UITextBorderStyleNone;
            tf.background = [[UIImage p_w_picpathNamed:@"bg_searchbox.png"] stretchableImageWithLeftCapWidth:20 topCapHeight:0];
            tf.leftView = nil;
            break;
        }
    }
}
_searchBar = [sBar retain];
[self.view addSubview:sBar];
[sBar release];


事情到這里,公司的任務(wù)就算結(jié)束了。這個(gè)要多問一句了。圖片中的數(shù)據(jù)哪里來的?這才是重點(diǎn)。


      玩過Linux c/c++的人都知道gdb,雖然你可能完全沒有用過,好吧,我承認(rèn),我也沒正經(jīng)用過,只是偶爾看到而已。iOS以前也是用gcc/gdb的,后來改用了llvm/lldb,但是大同小異了。只是這么大的程序的到底怎么玩調(diào)試,我還不知道,哪里去輸入,我查了半天才找到,其實(shí)挺簡(jiǎn)單,只要你斷點(diǎn)打上,在輸出log的那個(gè)區(qū)域可以直接輸入的。

     網(wǎng)上一哥們寫的 Xcode LLDB Debug教程,我抄在這里:

開胃小菜--簡(jiǎn)單的斷點(diǎn)調(diào)試

在xcode中打開一個(gè)app,在想要break的行號(hào)上單擊,即可生成一個(gè)深色的箭頭標(biāo)識(shí)--斷點(diǎn)。如下圖,在viewDidLoad:中設(shè)置了斷點(diǎn)。由UISearchBar引起的lldb調(diào)試

運(yùn)行app,等待。。。就可以看到xcode在斷點(diǎn)處進(jìn)入調(diào)試模式,現(xiàn)在讓我們把視線移到xcode右下角的控制臺(tái),有木有看到(lldb)這樣一行,鼠標(biāo)移到此行,輸入

1po [self view]
回車,看看控制臺(tái)上是不是多了一些view的信息,如下圖:由UISearchBar引起的lldb調(diào)試

po(print object)是LLDB的一個(gè)命令,其主要功能是輸出objective-c中對(duì)象(objects)的信息,與之相似的另外一個(gè)命令是 p(print),其主要功能是輸出原生類型(boolean、integer、float、etc)的信息。

控制臺(tái)輸入

p (int)[[[self view] subviews] count]
結(jié)果如下

(int) $2 = 2

注意這個(gè)使用了類型轉(zhuǎn)換告知調(diào)試器應(yīng)該如何處理返回值。

技巧一:運(yùn)行時(shí)修改變量的值

你以前怎么驗(yàn)證是不是某個(gè)變量的值導(dǎo)致整段程序不能正常工作?修改代碼中的變量的值,然后cmd+r重新啟動(dòng)app?現(xiàn)在你不需要這么做了,只需要設(shè)置一個(gè)斷點(diǎn),當(dāng)程序在這進(jìn)入調(diào)試模式后,使用expr命令即可在運(yùn)行時(shí)修改變量的值。

假如有一個(gè)loginWithUsername:方法,需要兩個(gè)參數(shù):username,password。

首先設(shè)置好斷點(diǎn),如下圖所示:

由UISearchBar引起的lldb調(diào)試

運(yùn)行app,進(jìn)入斷點(diǎn)模式后,在(lldb)后輸入

1expr username = @"username"
2expr password = @"badpassword"
控制臺(tái)會(huì)返回以下信息


1(NSString *) $0 = 0x3d3504c4 @"username"
2(NSString *) $1 = 0x1d18ef60 @"badpassword"
現(xiàn)在跳出斷點(diǎn),執(zhí)行斷點(diǎn)之后的兩條輸出語(yǔ)句,控制臺(tái)會(huì)有以下輸出


1(0x1c59aae0) A line forthe breakpoint
2(0x1c59aae0) Username and Password after: username:badpassword
看到看吧,我們?cè)谶\(yùn)行時(shí)修改了變量的值,事情還可以變的更簡(jiǎn)單一些,我們可以編輯斷點(diǎn),讓它自動(dòng)填充需要的修改的變量的值,并且可以選擇在此斷點(diǎn)處不進(jìn)入斷點(diǎn)模式,僅僅修改指定變量的值,然后自動(dòng)執(zhí)行后續(xù)代碼。


右擊斷點(diǎn)選擇“Edit Breakpoint...”(或者按住cmd+option,單擊斷點(diǎn)),然后如下圖所示設(shè)置斷點(diǎn)

由UISearchBar引起的lldb調(diào)試

注意選中了最后一行(“Automatically continue after evaluating”)的選擇框,這就保證運(yùn)行到這個(gè)斷點(diǎn)的時(shí),填充變量的值,然后繼續(xù)運(yùn)行,并不在此處斷點(diǎn)進(jìn)入調(diào)試模式。

運(yùn)行app,你會(huì)得到和上述手動(dòng)設(shè)置變量的值一樣的輸出。

接下來單擊斷點(diǎn),使其處于禁用狀態(tài),現(xiàn)在箭頭的顏色應(yīng)該是淺藍(lán)色的,重新運(yùn)行app,你會(huì)發(fā)現(xiàn)username和password的值沒有在運(yùn)行時(shí)被改變了。

技巧二:設(shè)置斷點(diǎn)觸發(fā)條件

斷點(diǎn)的另外一個(gè)重要作用,是可以設(shè)置觸發(fā)斷點(diǎn)生效的條件,這樣我們就可以在運(yùn)行時(shí)針對(duì)特定的數(shù)據(jù)進(jìn)行分析,觀察app是否運(yùn)行在正確的軌道上。如下圖:

由UISearchBar引起的lldb調(diào)試

上述截圖可以看到如下語(yǔ)句


1(BOOL)[(NSString*)[item valueForKey:@"ID"] isEqualToString:@"93306"]
通過這行語(yǔ)句,我們告訴編譯器:當(dāng)item中ID等于93306時(shí),此斷點(diǎn)生效,進(jìn)入斷點(diǎn)調(diào)試模式。


技巧三:格式化輸出數(shù)據(jù)

如果你厭倦了代碼里無窮無盡的NSLog,幸運(yùn)的是我們可以在編輯斷點(diǎn)使其輸出格式化字符串就像平常編碼時(shí)一樣。不過有一點(diǎn)需要注意,平常編碼時(shí)可能會(huì)使用NSString‘s stringWithFormat:輸出格式化字符串,不過這個(gè)方法貌似在斷點(diǎn)中木有效果,你需要使用alloc/init形式的方法,如下:


1po [[NSString alloc] initWithFormat:@"Item index is: %d", index]
由UISearchBar引起的lldb調(diào)試


運(yùn)行app,就能在控制臺(tái)看到想要的輸出啦!

簡(jiǎn)單!強(qiáng)大!這就是LLDB給你的選擇,從此代碼里可以不用再有NSLog滿天飛的情況了,代碼變得更干凈了,心情變得更愉悅了!

LLDB還有很多強(qiáng)大的地方,本教程只不過揭開了它的面紗,即便如此,仍讓我們沉醉不已。



    到這里,算是正式可以開始玩lldb調(diào)試了,官方主頁(yè)可以去查你想要額東西:http://lldb.llvm.org , l

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI