iOS 编译错误

1、设置 ImagePicker 的大小

ImagePicker 在 Popover Controller 总是以默认大小显示,设置 popoverContentSize 属性似乎无用。解决办法是将ImagePicker “包含”到一个定制的 ViewController 中,然后再 presentPopover 这个 ViewController :

UIViewController *containerController = [[UIViewController alloc] init];

containerController.contentSizeForViewInPopover = CGSizeMake(600,self.view.frame.size.height);

 [containerController.viewaddSubview:_imagePicker.view];

_popController= [[UIPopoverController alloc] initWithContentViewController:containerController];

CGPoint p=[self.view convertPoint:button.center

      fromView:sender.superview];

[_popController presentPopoverFromRect:(CGRect){p,CGSizeZero}

      inView:self.view

      permittedArrowDirections:UIPopoverArrowDirectionAny

       animated:YES];

[_imagePicker.view setFrame:containerController.view.frame];// 很重要

注意,popover的宽度最多600。此外,_imagePicker 每次 presentPopoverFromRect 之前都必须 init一次,否则显示位置不正确。

2、上传文件中文文件名乱码问题

在iOS客户端将文件名用URL Encode编码,然后在服务端用URL Decode解码。

客户端:

NSStringEncodingenc=NSUTF8StringEncoding;

[request setData:datawithFileName [filename stringByAddingPercentEscapesUsingEncoding:enc]

     andContentType:@"application/octet-stream" forKey:key];

服务端:

String filename=request.getParameter(“upload_file”);

3、Mac 64 bit Device

有时从SVN更新工程后,Scheme会显示为Mac 64 bit Device,并且不允许运行程序。这时只需要重新设置一下Target的DeploymentTarget就好(设置为模拟器或调试设备)。

4、去除调试程序的NSLog

编译参数Optimize Level根据不同的版本设置。例如对于Debug版本是None,对于Release版本是Fastest,Smallest。这样,我们可以根据这个参数来重新定义NSLog函数:

#ifndef __OPTIMIZE__

#define NSLog(...)NSLog(__VA_ARGS__)

#else

#define NSLog(...) {}

#endif

 

5、警告:no previous prototye for function

根据c规范, 如果函数没有参数,使用void作为函数参数。

函数声明应使用 “void functionA(void);”,而不能是”void functionA();”.

6、数组排序

方法一:

 

- (NSComparisonResult)compare:(Person *)otherObject {

    return [self.birthDatecompare:otherObject.birthDate];

}

 

NSArray *sortedArray;

sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)]; 

方法二: 

NSSortDescriptor *sortDescriptor;

sortDescriptor = [[[NSSortDescriptor alloc]initWithKey:@"birthDate"

                                             ascending:YES] autorelease];

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSArray *sortedArray;

sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

 

方法三( 10.6+):

 

NSArray *sortedArray;

sortedArray = [drinkDetails sortedArrayUsingComparator:^(id a, id b) {

    NSDate *first =[(Person*)a birthDate];

    NSDate *second =[(Person*)b birthDate];

    return [firstcompare:second];

}];

7、Xcode 4的build目录在哪里?

Xcode 4 做了许多改变。你将不能找到build目录,你也无法找到Products文件组。那么它把项目编译后生成的可执行文件放在哪里了呢?答案就是“{USERNAME}/Library/Developer/Xcode/DerivedData/{PROJECT_NAME_AND_RANDOM_CRAP}/Build/Products/{BUILD_TYPE}/{PROJECT_NAME}.app”目录。

8、警告:no rule to process file

Xcode试图侦测每一种文件的类型。当它认为文件属于“源文件”类型(比如.js文件),总是试图将它加到 Compile Sources中并试图编译。解决这个警告的办法是,把这类文件从Build Phases的 Compile Sources移到 Copy Bundle Resources中。

9、警告:'initWithFrame:reuseIdentifier:'is deprecated

该方法在后续版本中将被抛弃。请使用

-  initWithStyle:reuseIdentifier:

10、itms-services不工作

itms-services 被apple/iphone识别为一个特殊的字眼,它会校验provisioning profile中指定的证书并进行安装。

在安装这个.ipa文件前,要校验profisioning profile,这会连接到 "ax.init.itunes.apple.com"和 "ocsp.apple.com"。

如果你处于intranet中,请检查是否可访问上述地址。如果不能,你将无法使用OTA来安装应用程序。要求iOS 4.0以上。

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的答案是最准确的:

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

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
  • 完成

filename=URLDecode.decode(s,”utf-8”);

22、解决 messagesent to deallocated instance 0x52cc690 错误

当试图对某个对象进行赋值操作的时候出现这个错误,如:

tfContent.text=bodyText;

此时,你可以打开NSZombieEnable选项,则console会有如下输出:

***-[CFString _isNaturallyRTL]: message sent to deallocated instance 0x52cc690

说明_isNaturallyRTL消息被发送给了一个已经释放了的对象。从上面的语句看,可能是这两个对象:tfContent、bodyText。

你可以打印tfContent或者bodyText的内存地址,看看到底是哪个对象已经被释放掉了:

NSLog(@"tfContent:0x%x",(int) tfContent);

NSLog(@"bodytext:0x%x",(int) bodyText);

结果表明是bodyText被提前释放:

tfContent: 0x52cf160

bodytext: 0x52cc690

在适当的地方对bodyText进行retain,问题解决。

23、 putpkt:write failed: Broken pipe错误

重启设备。

24、.hfile not found

实际上该.h文件并没有被包含进target。选择对应.m文件,点击“ShowUtilities”按钮(在工具条的右端),在Utilities中找到Target Membership,将Target前面的勾去掉,然后再重新勾上。即相当于将该.m文件重新加入target的Buildphase中。

25、 Xcode 4:如何将for iPhone的xib转变为for iPad

在Xcode 3.x中,将xib从iPhone版转变为iPad版,通过Create iPad Version菜单。

但在Xcode 4.x中,这个菜单找不到了。通过一番摸索,笔者发现可以用如下方法将xib转换为iPad版本。 

26、icon dimensions (0 x 0) don't meet the size requirements.

打开Project的BuildSettings,找到Compress PNG Files,将值设置为No。

或者:

选中该png文件,在FileInspector面板中,找到File Type,将其由 "PNG" 修改为 "Icon".

27、警告: noprevious prototype for function

打开Target->BuildSettings,搜索prototype,将Missing Function ProtoTypes改为NO。

28、CorePlot编译时出现 错误“Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clangfailed with exit code 1”

请将Scheme 从 iOS Device 改为 iPhone 5.0 Simulator。或者将Compiler for C/C++ 改为 LLVM GCC4.2。同时,Core Plot 1.0 不再支持老的 armv6 CPU。

29、使用CABasicAnimation改变UIView的alpha值无效

UIView的alpha值,在CALayer中其实是"opacity",请使用opcity作为keyPath。

30、CorePlost:定制 Axis Label 后,Tick Mark 不显示。

设置Axis 的majorTickLocations 为你想显示 tick mark 的位置。

NSMutableArray*customTickLocations=[[[NSMutableArray alloc]init]autorelease];

for(int i=0;i<10;i++){

[customTickLocationsaddObject:[NSNumber  numberWithInt:i]];

}

xAxis.majorTickLocations=[NSSetsetWithArray:customTickLocations];

 

31、定制的UITableViewCell, indentationLevel不能生效

需要在定制的UITableViewCell中实现layoutSubviews方法。

 - (void)layoutSubviews

{

    [super layoutSubviews];

    float indentPoints = self.indentationLevel *self.indentationWidth;

    for(UIView *view in self.subviews){

        view.frame = CGRectMake(

                               view.frame.origin.x+indentPoints,

                               view.frame.origin.y,

                               view.frame.size.width,

                               view.frame.size.height

                               );

    }

}

32、打开Target的Build Settings,找到Architectures选项,将其从“$(ARCHS_STANDARD_32_BIT)”修改为“armv6$(ARCHS_STANDARD_32_BIT)”。注意大小写是敏感的。“$(ARCHS_STANDARD_32_BIT)”是一个变量,实际上等同于armv7。

33、Base SDK不需要改变,仍然是Lastest iOS。

34、打开Target的info,找到Required device capabilities,将下面的armv7删除。这个选项是Xcode4自己添加在工程中的默认设置,如果不去掉它,第1步-第2步的工作是无法生效的。

35、修改xib源文件

xib文件其实是一个xml文件。在Project Navigator中,在xib文件上右键,选择“Open As -> Source Code”,即可以源代码方式查看xib文件,找到"com.apple.InterfaceBuilder3.CocoaTouch.XIB"一行,将其改为 "com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB",即增加了".iPad"。

按下⌘+F,打开搜索栏,点击Replace菜单,将模式改变替换模式。将xib文件中所有"IBCocoaTouchFramework"用 "IBIPadFramework"替换。

按下⌘+S,保存修改。

36、修改xib的视图尺寸

在xib文件上右键,选择“Open As -> Interface Builder – iOS”,用IB模式打开。

选择xib文件中的根视图(UIView),在属性面板中找到Size选项,将其改为Full iPad Screen。

现在,你可以有一个iPad版本的xib了。


你可能感兴趣的:(iOS 编译错误)