iOS开发可能会遇到的那些坑

作者: 没了蜡笔de小新 | 来源:发表于2017-04-28 15:58 被阅读610次

好久没更新简书,嘻嘻☺️,我胡汉三又肥来了~~~

废话不多说,直接进入正题,希望能帮到优雅的过坑!!!

1、

local declaration “XXX”hide instance variable

reason:一般是你函数里面定义的变量和class属性变量重名了。很少有和系统变量重名的情况。 这样的情况,修改一下变量的名字就好。

2、

Undefined symbols for architecture x86_64:```

 可能由于某些类库不支持64位Architecture造成,

 可以在项目Build Setting-->Architecture设为非64位的选项


3、编译

warning:ld: warning: directory not foundfor option


 选择工程, 编译的 (targets)

 选择 Build Settings 菜单

 查找 Library Search Paths 和 Framework Search Paths,删掉编译报warning的路径即OK

 
4、

Undefined symbols for architecture armv7s: “OBJC_CLASS$_SZAdWebViewDelegate”, referenced from:xxxx


 查找了半天,总以为缺少某个文件,后对比正常的sample发现问题出在armv7s,这是针对iPhone5 cpu优化的编译,可能你某个库不支持,解决方法是:

 Build Setting->Build Active Architecture only 的值由NO设为YES,查了一下这个选项的资料:
 这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。
 而设置为no时,会编译所有的版本。

 这个是设备对应的architecture:
 armv6:iPhone 2G/3G,iPod1G/2G
 armv7:iPhone 3GS/4/4s,iPod3G/4G,iPad1G/2G/3G
 armv7s:iPhone5, iPod5

 编译出的版本是向下兼容的(不太对,应该说,设备是向下兼容的),比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。

 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。


5、

Xcode “Attaching to…” 卡住,模拟器停留在启动界面

解决方案:
 网上有很多方法,什么Clean Build Folder,和各种删除projects、driveddata
>试试  重启大法

6、

error: macro names must be identifiers YourProject_prefix.pch


原因: 因为你弄脏了预处理器宏,在它处于<Multiple Values>的时候修改了它

解决方法: Configiration选择All Configirations,清空它 然后分别重新定义你的Debug,Release,Distributin预处理器宏吧

7、

warning: no rule to process file '$(PROJECT_DIR)/LoadingView.h' of type sourcecode.c.h for architecture armv6


原因: Target里Compile Sources里含有头文件 了,那里面不需要头文件

解决方法: 从Target里Compile Sources里删除头文件

8、Command 
```/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS Build System Support.xcplugin/Contents/Resources/copypng failed with exit code 1 ```

原因: png图像文件拷贝失败,看看信息上面提示Can't find哪个文件,一般都是从文件系统里删除文件而没有通过Xcode删除造成的,Xcode的项目配置文件依然纪录着这个文件的引用

解决办法: 给文件系统里增加相应的文件,或者从Xcode的Groups & Files删除它,或者从Target的Copy Bundle Resources里删除它

9、

Code Sign error: The identity 'iPhone Developer: Your Name' doesn't match any valid certificate/private key pair in the default keychain```

原因: 签名错误

解决办法: Target -> Get Info -> Build -> Code Signing -> 修改签名
记得左上角的Configuration类型要跟当前Build类型对应(Debug, Release, Distribution),否则改了也白改

10、

could not create bundle folder for versioned model *.moda(好像是这个后缀名的这个文件)```

原因:编译一次会产生一个新的

解决办法:应该把编译产生出来的moda文件都删了,然后clean下工程,重新build即可

11、

error:Cannot assign to 'self' outside of a method in the init family```

原因:只能在init方法中给self赋值,Xcode判断是否为init方法规则:方法返回id,并且名字以init +大写字母开头+其他 为准则。例如:- (id) initWithXXX;

出错代码:

- (id) Myinit{
 self = [super init];
 ……
}```

解决方法:
  • (id) initWithMy
    {
    self = [super init];
    }```

12、

iOS真机调试时,报错:failed to get the task for process 20900```

原因:
证书问题,project和targets的证书都必须是开发证书,ADHOC的证书会出现此问题。

解决方案:
    project和targets的证书使用开发证书。

13、

当 一个socket正在连接,这时又一个新的socket建立链接,会抛出错误 “ Attempting to connect while connected or accepting connections. Disconnect first.”

原因:
第一个socket还没返回isConnected 为YES, 就建立第二个socket连接。

解决方案:


如图所示

****加上这两句代码 可释放使用完的asyncUdpSocket

14、

tcp socket willDisconnectWithError:Error Domain=NSPOSIXErrorDomain Code=65```

 "The operation couldn’t be completed. No route to host"
        No route to host (socket error ::10065) 
       产生此问题的原因:网络连接不上此服务器。

       解决:查看ip是否正确,查看调试设备网络连接是否正常。

15、报错:

CALayer bounds contains NaN:```

绘图时,某个长宽值中包含除数为0的操作。

解决方案:在分母处加上不为零的判断,防止0出现在分母地方

16、报错:

libxml/tree.h not found    第三方库找不到的错误```
      
解决方案:
      步骤1:
      工程-->PROJECT-->Build Settings
      将“Header Search Paths”的值设置为<${SDK_DIR}/usr/include/libxml2>即可。

      步骤2:
      工程-->TARGETS-->Build Settings
      将“Header Search Paths”的值设置为<${SDK_DIR}/usr/include/libxml2>即可。

17、报错:

iOS Expected unqualified-id 和 Unkown type name 'NSString'

iOS使用到OC与C++混编的时候刚把C++的类拖入工程编译, NSObjCRuntime与NSZone就报错:
Expected unqualified-id Unkown type name ‘NSString’ Unkown type name ‘Protocol’

解决方案:
修改你的.pch(项目头文件) 将所有的import与define的代码全部放在***#ifdef **OBJC*****与***#endif*** 之间, 如下我将所有的define与import代码放入了一个.h头文件中, 然后在这中间导入头文件.

ifdef OBJC

import "xxxxxxxx.h"

endif // OC的头文件

> 这是因为将C++拖入项目之后, 默认编译会先编译C++类, 编译之后导入OC的类的时候, 编译的场景是C++, 所以会出现unknown type的报错, 使用了#ifdef OBJC与#endif 之后, 就相当于说着中间的定义与导入时OC环境. 从而规避掉了报错

如果本文帮到了你,希望动手点一下👍,❤️,还可以➕关注,感谢~~~

相关文章

网友评论

    本文标题:iOS开发可能会遇到的那些坑

    本文链接:https://www.haomeiwen.com/subject/wwxazttx.html