1、id和NSObject*的区别:
1、id是objc_object的结构体指针,定义是typedef struct objc_object id,所有的oc对象都可以用id指向,而且在编译阶段不作类型检查。id对象调用这个对象存在的方法在编译阶段都不会报错,但是调用不存在的方法会。 2、NSObject指向的必须是NSObject的子类,调用的方法也必须是NSObject子类的方法,否则必须作强制的类型转换。 3、不是所有的oc对象都是NSObject的子类,比如说有一些继承自NSProxy,NSObject*可指向的对象是id的子集。
2、使用系统的某些block api(如UIView的block版本写动画时),是否也考虑循环引用问题?
系统的某些block api中,UIView的block版本写动画时不需要考虑: UIView的animation动画 NSOperationQueue NSNotificationCenter通知 但也有一些api 需要考虑。
但如果方法中的一些参数是成员变量,那么可以造成循环引用,如 GCD、NSNotificationCenter调用就要小心一点,比如 GCD内部如果引用了 self,而且 GCD 的参数是成员变量,则要考虑到循环引用,
举例如下:
分析:self-->_operationsQueue-->block-->self形成闭环,就造成了循环引用。
__weak __typeof__(self) weakSelf = self;
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
[weakSelf doSomething];
[weakSelf doSomethingElse];
} );
分析:self-->_observer-->block-->self形成闭环,就造成了循环引用。
3、Swift 下的如何使用 KVC?
1、在swift3.0之前,类必须要继承自NSObject,因为KVC是OC的东西 2、在Swift4.0之后,类必须要继承自NSObject,同时还需要在属性前面加上@objc KVC出来的Value需要解包。
4、如何对定位和分析项目中影响性能的地方?以及如何进行性能优化?
instruments。 比如要查看程序哪些部分最耗时,可以使用Time Profiler,要查看内存是否泄漏了,可以使用Leaks等。
5、怎么防止反编译?
本地数据加密。
iOS应用防反编译加密技术之一:对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息。
URL编码加密。
iOS应用防反编译加密技术之二:对程序中出现的URL进行编码加密,防止URL被静态分析。
网络传输数据加密。
iOS应用防反编译加密技术之三:对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据。
方法体,方法名高级混淆。
iOS应用防反编译加密技术之四:对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码。
程序结构混排加密。
iOS应用防反编译加密技术之五:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。