iOS面试知识点

iOS面试知识点

(1)Java垃圾回收机制和ARC回收机制的区别?
ARC自动引用计数(automatic reference counting),当你在编译程序时提供自动管理内存的功能,
它会为程序自动加入内存的控制代码,控制独享声明周期。这样一来,就可以简化内存管理步骤。
不过支持的版本是在iOS4,iOS5以上。【注意创建项目的时候,勾选ARC功能】

与Java语言相同Objective-c 2.0之后,也提供了垃圾回收机制。但是在iOS移动终端设备中,并不
支持垃圾回收机制。因此,iPhone并不能对内存进行自动垃圾回收处理(autorelease)。因此需要注意
垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存,编译器会再适当的地方
自动插入retain,release和autorelease消息。

(2)nonatomic,assign,copy,retain的区别
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。(atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所 以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。)
assign: 简单赋值,不更改索引计数对基础数据类型 (NSInteger)和C数据类型(int, float, double, char, 等)
copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 对其他NSObject和其子类
copy与retain的区别:
copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。
eg:一个NSString 对象,地址为0×1111 ,内容为@”STR”
Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化
retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain 是指针拷贝,copy 是内容拷贝。


(3)#import 与 #include的区别
#import
In the C language, the #include pre-compile directive always causes a file's contents to be inserted into the source at that point. Objective-C has the equivalent #import directive except each file is included only once per compilation unit, obviating(去除) the need for include guards.
for example 三个文件
文件A.h
文件B.h
文件C.h
文件C.h需要引入A.h、B.h ,文件B.h需要引入文件A.h,这样就重复引用了A.h两次,使用#import可以进行优化

#import比起#include的好处就是不会引起交叉编译

二、@class是用来做类引用的
@class就是告诉编译器有这么一个类,至于类的定义是啥不知道

@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import

举个例子说明:
在ClassA.h中
#import ClassB.h 相当于#include整个.h头文件。如果有很多.m文件#import ClassA.h,那么编译的时候这些文件也会#import ClassB.h增加了没必要的#import,浪费编译时间。在大型软件中,减少.h文件中的include是非常重要的。

如果
只是@class ClassB 那就没有include ClassB.h。仅需要在需要用到ClassB的ClassA.m文件中 #import ClassB.h

那么什么时候可以用@class呢?
如果ClassA.h中仅需要声明一个ClassB的指针,那么就可以在ClassA.h中声明
@ClassB
...
ClassB *pointer;


(4)数据库三范式

(5)GCD
dispatch_sync 同步线程
dispatch_async 异步线程

(6)Objective-C中的instancetype和id区别
1、相同点
都可以作为方法的返回类型
2、不同点
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
②instancetype只能作为返回值,不能像id那样作为参数。

(7)NSInteger 和 int 区别

查看源码
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

typedef long NSInteger;

typedef unsigned long NSUInteger;

#else

typedef int NSInteger;

typedef unsigned int NSUInteger;
#endif

NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。
当你不知道你的操作系统是什么类型的时候,你通常会想要使用NSInteger,所以或许你想要你的int类型范围尽可能的大,用NSInteger,32位系统NSInteger是一个int,即32位,但当时64位系统时,NSInteger便是64位的。一般推荐用NSInteger的。

原文地址:https://www.cnblogs.com/Clin/p/4708933.html