iOS 開發百問(2) – iPhone手機開發技術文章 iPhone軟體開發教學課程

11、無法調試設備“Error launching remote program: failed to get the task forprocess 6405.”

ad-hoc Profile不支持調試。改為development profile。

12、OTA無法下載,提示“無法下載應用程序”

.plist文件中的 bundle-identifier寫錯瞭(或者包含中文字符),比如:

bundle-identifier

com.xxx.–APN–

其中的com.xxx.—APN—中包含中文(“–”),應改為英文。

或者簽名證書是無效的。請在Orgnizer中檢測簽名證書。

12、ASIHTTPRequest中經常出現EXEC_BAD

使用ASIHTTPRequest進行異步請求時,經常出現程序崩潰。尤其在是請求過程中(未Finished),如果你切換瞭視圖的時候。因為是異步請求,request對象可能在任何時候調用delegate(ViewController),而此時ViewController卻可能已經釋放瞭。因為UIKit隨時會釋放當前不顯示的ViewController。如果你切換瞭ViewController,那麼那個被隱藏的ViewController隨時會被釋放。如果request回調ViewController的delegate方法時,而那個ViewController正好被UIKit給釋放,則會導致EXEC_BAD。在官方文檔中也提到:Requests don’t retain their delegates, so if there’s a chance your delegatemay be deallocated while your request is running, it is vital that you clearthe request’s delegate properties. In most circumstances, if your delegate isgoing to be deallocated, you probably also want to cancel request, since you nolonger care about the request’s status

因此在使用ASIHTTPRequest進行異步編程時,我們要自己清空request的delegate屬性。在delegate(ViewController)的dealloc方法中你應該: 
[request clearDelegatesAndCancel];
[request release];

當然,request不能是臨時變量,而應當是一個retained的成員對象(或者屬性),否則你無法在dealloc方法中clearDelegatesAndCancel。

13、Assertion failure in -[UIActionSheet showInView:]

在主線程中打開action sheet:

[selfperformSelectorOnMainThread:@selector(showActionSheet) withObject:nilwaitUntilDone:NO];

showActionSheet方法:

-(void) showActionSheet

{ sheet = [[UIActionSheet alloc] initWithTitle:@”This is my ActionSheet!” delegate:self cancelButtonTitle:@”OK”destructiveButtonTitle:@”Delete Message!” otherButtonTitles:@”Option1″, @”Option 2″, @”Option 3″, nil];

[sheet showInView:self.view];

}

14、RegexKitLite編譯錯誤

編譯時提示如下錯誤:

“_uregex_find”, referenced from: _rkl_search in RegexKitLite.o

……

在Build Settgins的Other Linke Flag中加入

-licucore

15、Archive時遇到“ResourceRules.plist:cannot read resources”錯誤

在build settings中找到Code Signing Resource Rules Path,填入$(SDKROOT)/ResourceRules.plist

16、使用ZombieEnable解決EXEC_BAD_EXCESS錯誤

這個錯誤是向一個release對象發送消息導致的。可以通過開啟ZombieEnable參數來查找真正的問題。

Edit Scheme,選擇Run …Debug,打開Arguments組,在Environment Variables中添加一個參數:

運行程序,當出現EXEC_BAD_EXCESS錯誤時,控制臺中會輸出具體出錯的信息,比如:

*** -[ITSMTicketCell release]: message sent to deallocated instance0x897e920

直接指明瞭是由於某個對象在被釋放之後,你發送瞭一條消息給它。

17、 關於Xcode4無法調試2代代老設備的問題

升級到Xcode4以後,你會發現許多程序無法在2代設備(有些3代設備,比如iTouch 3實際上仍然是2代的硬件)上運行瞭,並且Xcode4僅僅“Running…”就直接“Finished…”瞭,無論是Xcode控制臺還是設備日志中,都沒有任何提示。

註意:2代和3代的區別在於cpu架構。2代設備使用ARMv6架構cpu,3代設備使用ARMv7架構cpu。 iPhone 2G/3G,iPod 1G/2G屬於ARMv6架構(2代),iPhone3GS/4, iPod 3G,iPad屬於ARMv7架構(3代)。

stackoverflow上有關於這個的帖子,其中shapecatcher的答案是最準確的:

https://stackoverflow.com/questions/6378228/switching-from-xcode3-to-xcode4-cant-load-programs-onto-older-ipod-touch

1、打開Target的Build Settings,找到Architectures選項,將其從“$(ARCHS_STANDARD_32_BIT)”修改為“armv6$(ARCHS_STANDARD_32_BIT)”。註意大小寫是敏感的。“$(ARCHS_STANDARD_32_BIT)”是一個變量,實際上等同於armv7。

2、Base SDK不需要改變,仍然是Lastest iOS。

3、打開Target的info,找到Required device capabilities,將下面的armv7刪除。這個選項是Xcode4自己添加在工程中的默認設置,如果不去掉它,第1步-第2步的工作是無法生效的。

18、“Avalid provisioning profile for this device was not found.”

在你的開發證書中增加該設備的UDID。

19、將設備添加到 portal

連接設備,打開Orgnizer。在設備列表中選中設備,點擊右邊窗口左下角的“Add to Portal”按鈕。或者在設備列的設備上右擊,選擇“AddDevice to Provisioning Portal”。

20、renew profile

打開Orgnizer,在LIBRARY中選擇Provisioning Profiles。在右邊窗口選擇要renew的profile,點擊右下角的“Refresh”按鈕。輸入Portal的密碼,profile將被renew。

21、renew簽名證書及設備激活文檔

從portal移除過期的簽名證書重新制作開發證書和發佈證書刪除開發和部署所用的激活文檔(provisioningprofiles)使用新的證書重新制作用於開發和部署的Provisioningprofiles從鑰匙串中刪除老的證書在XcodeOrganizer中安裝新的provisioning profiles完成

發佈留言