自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iPhone Bug分析過程和Xcode編譯器改進(jìn)

移動(dòng)開發(fā) iOS
本文介紹的是iPhone Bug分析過程和Xcode編譯器改進(jìn),主要解決BUG的出現(xiàn),具體詳細(xì)內(nèi)容請(qǐng)來看內(nèi)容。

iPhone Bug分析過程和Xcode編譯器改進(jìn)是本文要介紹的內(nèi)容,最近IPhone項(xiàng)目中的一個(gè)bug困擾了我兩天多,我把解決的過程分享出來,便于我自己整理思考問題的方式,也希望其中一些problem solving的方法能夠?qū)Υ蠹矣兴梃b。

現(xiàn)象:

在程序前后導(dǎo)航時(shí),上一個(gè)頁面的導(dǎo)航欄會(huì)殘留,點(diǎn)擊其button會(huì)響應(yīng)上一個(gè)頁面的事件或Crash。

這是在我剛剛Update到ios sdk 4.01時(shí)產(chǎn)生的,并且只在IPhone 2G 上重現(xiàn),在模擬器和3GS上都正常工作。 我的直接想法就是,這是IPhone sdk的問題,因?yàn)樾掳姹镜膕dk對(duì)2G不兼容導(dǎo)致的。但后來在Hailiang的IPod touch 3G上也能重現(xiàn),我意識(shí)到這個(gè)bug的優(yōu)先級(jí)比較高,需要解決。

首先,從現(xiàn)象入手,精確還原重現(xiàn)的條件。

IPhone 2G    3.1.2    重現(xiàn)

IPhone 2G    3.1.3    重現(xiàn)

IPod Touch   3.1.2   重現(xiàn)

IPhone 3Gs  3.1.3   不重現(xiàn)

IPhone 4G    4.1      不重現(xiàn)

IPhone simulator     不重現(xiàn)

分析:

從現(xiàn)象上分析,跟OS無關(guān),因?yàn)樵?.1.2 , 3.1.3上都能重現(xiàn),還是跟硬件相關(guān),在2G和ipod上重現(xiàn),直覺還是新版SDK跟舊版硬件不兼容導(dǎo)致的,跟程序代碼無關(guān)。

那我就來驗(yàn)證一下是否有這個(gè)兼容性問題,拿新版的SDK寫一個(gè)最簡單的sample導(dǎo)航程序在2G上跑,看能否重現(xiàn)。 結(jié)果是不能重現(xiàn)。 這說明之前的猜想不對(duì),沒有兼容性問題,問題還是在我們的項(xiàng)目中。

那是什么問題呢? 代碼邏輯的問題嗎?但是在3GS上是工作的,應(yīng)該不是代碼邏輯的問題。為了能把代碼邏輯問題獨(dú)立出來,我修改了項(xiàng)目的main函數(shù),不執(zhí)行我們的程序入口,而只是簡單創(chuàng)建兩個(gè)導(dǎo)航頁面。問題仍然存在。看來代碼邏輯是沒有問題的。

那極有可能是項(xiàng)目編譯配置的問題,于是我把項(xiàng)目所有的配置跟sample程序一一比較,將所有的關(guān)于代碼生成/優(yōu)化等設(shè)置得跟sample一樣, 結(jié)果bug仍然存在,看來跟項(xiàng)目配置無關(guān)。為了確認(rèn)跟項(xiàng)目配置無關(guān),我把項(xiàng)目中的所有文件刪除,只留那兩個(gè)簡單導(dǎo)航頁面,問題不重現(xiàn)。 看來這個(gè)猜想是正確的。

那是什么問題呢? 考慮到我們用了好幾個(gè)第三方的庫。我覺的可能是第三方的庫的編譯設(shè)置問題或者是第三方的庫用到了某些庫跟舊版本的系統(tǒng)sdk沖突。 于是我把第三方的庫一一剝離出來,結(jié)果仍然重現(xiàn)。 這里順便提一下一個(gè)比較好的實(shí)踐,如果用到了第三方的庫,***把用到的接口放到一個(gè)獨(dú)立的文件里,這樣你懷疑第三方的庫有問題時(shí),可以做一個(gè)stub,去掉第三方庫,方便驗(yàn)證你的猜想。

既然第三方的庫也沒有問題,那看來是我們自己代碼的問題了。 沒有什么太好的辦法,我只好把我們的代碼一個(gè)個(gè)文件從項(xiàng)目中剝離,驗(yàn)證bug是否重現(xiàn)。運(yùn)氣不太好,當(dāng)我剝離到***兩個(gè)文件時(shí),才確認(rèn)bug是出在那兩個(gè)文件里。 這里也順便提一下,保證項(xiàng)目中文件結(jié)構(gòu)和依賴層次的清晰是非常重要的。比如A依賴B,B依賴C,C又依賴A,那在剝離的時(shí)候就很難下手。

Bug的root cause:

***的bug出在Queue.h 和Queue.m中,這是我之前寫的一個(gè)通用的Queue類(Objective-c 不提供Queue和Stack)。在Objective-C 中有Category的概念,跟C#中的partial class 概念類似,就是一個(gè)類的定義可以在兩個(gè)文件中。這樣就可以已這種方式對(duì)已有的類進(jìn)行擴(kuò)展,比如添加你自己的方法。我的Queue類 就是在Array類的基礎(chǔ)上 加了pop和push兩個(gè)方法,悲劇的是,在UINavigationController(IPhone導(dǎo)航)的實(shí)現(xiàn)里,它內(nèi)部是用一個(gè)stack來維護(hù)每個(gè)導(dǎo)航頁面,而這個(gè)stack的實(shí)現(xiàn)方式我猜跟我實(shí)現(xiàn)Queue一樣,也是擴(kuò)展了Array類,它也取名叫pop和push,兩者發(fā)生沖突。 我把push跟pop改為 enqueue和dequeue,問題解決。

  1. @interface NSMutableArray (QueueAdditions)  
  2. - (id)pop;  
  3. - (void)push:(id)obj; 

@end

結(jié)論:

不要輕易懷疑SDK或者編譯器。 對(duì)于一些莫名其妙的bug,起初懷疑時(shí)系統(tǒng)的問題,往往還是你自己代碼的問題。

大膽假設(shè),小心求證。對(duì)于所有難解的bug,從現(xiàn)象出發(fā),根據(jù)你的經(jīng)驗(yàn)假設(shè)問題的所在,然后一步步驗(yàn)證,抽絲剝繭,***總能找出問題所在。

另外的一個(gè)結(jié)論是, Apple 應(yīng)該對(duì)編譯器做改進(jìn),在Category(partial class)里對(duì)重名的symbol,應(yīng)該在鏈接的時(shí)候報(bào)錯(cuò),否則在運(yùn)行時(shí)是很難去定位bug的。

小結(jié):iPhone Bug分析過程和Xcode編譯器改進(jìn)的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

本文來自:http://www.cnblogs.com/MobileDevelop/archive/2010/10/12/1848601.html

責(zé)任編輯:zhaolei 來源: CSDN博客
相關(guān)推薦

2009-11-26 15:50:06

VS2003編譯器

2011-08-01 09:34:32

Xcode Xcode 4 編譯器

2011-01-06 11:36:00

linuxGCC編譯器

2020-11-10 13:42:07

Go編譯器修復(fù)

2009-08-24 11:36:27

CLR加載過程

2015-09-18 20:06:32

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2011-07-22 18:25:20

XCode iPhone SDK

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2010-03-26 16:23:07

Visual Stud

2011-07-06 17:53:40

iPhone SDK Xcode

2020-11-03 10:32:22

編譯器工具代碼

2015-09-20 21:21:20

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發(fā)者

2020-10-26 11:33:45

編程語言編譯器軟件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)