分类目录归档:错误分析

Xcode10 linker command failed with exit code 1 (use -v to see invocation)

1、前两天升级了Xcode 10的GM版,本来等两天就可以正式升级更新了,实在等不了了。
2、升级后发现原来的项目编译不通过,一直报错linker command failed with exit code 1 (use -v to see invocation);
3、点击报错也没有定位具体是哪里的问题,这下好了,回头用Xcode9是好好的;
4、网上查了一下,很多描述都指向了libstdc++这个库,并且据说苹果官方在5年前就有声明将要废弃,后续使用libc++库来替代之;
5、其实我们自己是不会主动使用这种库的,因为这是C++库,我们一般也不会在代码里面大量使用C++;
6、那问题基本上是找到点了,使用这些库的一般是有图形处理相关的需求,比如地图;
7、废话不说多了,如何处理才是正题,直接添加libstdc++库是不行了,因为iOS12SDK中已经不包含这个库了;
8、目前最简单的方法就是将Xcode9中的libstdc++相关的库拷贝到Xcode10中来,避免引用报错,应该就搞定了!
9、真机路径:Xcode.app⁩ ▸ ⁨Contents⁩ ▸ ⁨Developer⁩ ▸ ⁨Platforms⁩ ▸ ⁨iPhoneOS.platform⁩ ▸ ⁨Developer⁩ ▸ ⁨SDKs⁩ ▸ ⁨iPhoneOS.sdk⁩ ▸ ⁨usr⁩ ▸ ⁨lib⁩
10、在这个lib目录下,相关的文件有libstdc++.6.0.9.tbd、libstdc++.tbd、libstdc++.6.tbd;
11、将这三个文件,从Xcode9中拷贝到Xcode10相对应的目录下;
12、模拟器:⁨Xcode.app⁩ ▸ ⁨Contents⁩ ▸ ⁨Developer⁩ ▸ ⁨Platforms⁩ ▸ ⁨iPhoneSimulator.platform⁩ ▸ ⁨Developer⁩ ▸ ⁨SDKs⁩ ▸ ⁨iPhoneSimulator.sdk⁩ ▸ ⁨usr⁩ ▸ ⁨lib⁩;
13、解决办法类似,也是将相对应的文件拷贝到相关路径,注意:相对应!!!模拟器拷模拟器,真机拷真机。

14、libstdc++库文件下载:libstdc++.6.0.9.tbd

如何忽略Xcode中编译时的警告

引言:
使用pods来集成第三方框架或组件估计在大部分中项目中都会碰到,然后这会带来另外一个问题,第三方代码中会出现一些编译警告,我们该如何处理呢?
1、Unlock其文件,将bug改掉?!对于有强迫症的人来讲这个确实是太难受了,但升级后又得改一次,如果警告较多的话,这还将是一个不小的工作量;
2、使用预编译指令,使开发工具自动忽略掉其中的警告,其实这也会涉及到修改第三方代码,并且如果警告类型较多,工作量也不小;
3、有没有一行代码就能搞定的事情?!好在是有的。在pods工程的Podfile中,添加一行inhibit_all_warnings!,然后pod update一下即可,轻松搞定!

1
2
3
4
platform :ios, '8.0'
inhibit_all_warnings!
 
target 'xxxxxx' do

再编译看看,是不是警告都没有了,整个心情都不一样了!

常见的警告类别有

1
2
3
4
5
6
7
//常见警告的名称
//1, 声明变量未使用  "-Wunused-variable"
//2, 方法定义未实现  "-Wincomplete-implementation"
//3, 未声明的选择器  "-Wundeclared-selector"
//4, 参数格式不匹配  "-Wformat"
//5, 废弃掉的方法    "-Wdeprecated-declarations"
//6, 不会执行的代码  "-Wunreachable-code"

顺便再提一下,如果自己代码中的警告,有两种方式可以忽略:
第一、通过在Build Setting中设置Other Warning Flags来忽略全局的警告提示;
具体做法是在Build Setting中搜索Other Warning Flags,警告类型添加进去即可;
第二、如果要忽略部分代码的警告,可在代码中插入

1
2
3
4
#pragma clang diagnostic push
?#pragma clang diagnostic ignored "警告类别"
//这是代码
#pragma clang diagnostic pop

这三句是一组,夹在中间的代码警告会被编译器所忽略;

Java基础知识之异常处理Exception的基本使用

1、设计一个Person类,该类包含一个age属性,即人的年龄,该值不能为负数;
2、在给该对象属性赋值为负数时,抛出异常,有两种方式可以实现;
2.1、在Person对象的setAge方法中将异常进行抛出,uncheked方式,能正常编译通过,运行时报错;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Person{
	private int age;
	public void setAge(int age){
		if (age < 0){
			throw new RuntimeException("年龄不能为负数...");
		}
		this.age = age;
	}
}
class Demo{
	public static void main(String args[]){
		Person p = new Person();
		p.setAge(-1);
	}
}
运行结果:
Exception in thread "main" java.lang.RuntimeException: 年龄不能为负数...
	at Person.setAge(Person.java:5)
	at Demo.main(Demo.java:4)

继续阅读