11. デバイスをデバッグできません。「リモート プログラムの起動エラー: プロセス 6405 のタスクを取得できませんでした。」
アドホック プロファイルはデバッグをサポートしていません。開発プロファイルに変更します。
12. OTA をダウンロードできず、「アプリケーションをダウンロードできません」というメッセージが表示される
.plist ファイル内のバンドル識別子が正しく書かれていない (または中国語の文字が含まれている)。例:
<key>bundle-identifier</key> <string>com.xxx.--APN--</string>
com.xxx.—APN— は次のとおりです。含まれている中国語 (「--」) を英語に変更する必要があります。
または署名証明書が無効です。 Orgnizer で署名証明書を検出してください。
12. ASIHTTPRequest に EXEC_BAD がよく出現します
ASIHTTPRequest を使用して非同期リクエストを行うと、プログラムがクラッシュすることがよくあります。特にリクエストの処理中 (完了ではない) にビューを切り替えた場合。これは非同期リクエストであるため、リクエスト オブジェクトはいつでもデリゲート (ViewController) を呼び出すことができ、この時点で ViewController が解放されている可能性があります。なぜなら、UIKitは現在表示されていないViewControllerを随時解放してくれるからです。 ViewControllerを切り替えると、隠れていたViewControllerがいつでも解放されます。リクエストが ViewController のデリゲート メソッドをコールバックし、その ViewController がたまたま UIKit によって解放された場合、EXEC_BAD が発生します。公式ドキュメントにも記載されています: リクエストはデリゲートを保持しないため、リクエストの実行中にデリゲートの割り当てが解除される可能性がある場合は、ほとんどの状況でリクエストのデリゲート プロパティをクリアすることが重要です。割り当てが解除されようとしている場合、リクエストのステータスを気にしなくなったので、リクエストをキャンセルすることもできます
したがって、非同期プログラミングに ASIHTTPRequest を使用する場合は、リクエストのデリゲート属性を自分でクリアする必要があります。 delegate(ViewController) の dealloc メソッドでは、次のことを行う必要があります:
[request clearDelegatesAndCancel]; [request release];
もちろん、request を一時変数にすることはできませんが、保持されるメンバー オブジェクト (または属性) にする必要があります。そうでない場合は、dealloc メソッドで clearDelegatesAndCancel を実行できません。
13. -[UIActionSheet showInView:] でのアサーション失敗
メインスレッドでアクションシートを開く:
[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的答案是最准确的:
http://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
完成
以上就是iOS 开发百问(2)的内容,更多相关内容请关注PHP中文网(www.php.cn)!