1. 简述OC中内存管理机制。与retain配对使用的方法是dealloc仍是release,为何?须要与alloc配对使用的方法是dealloc仍是release,为何?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的做用?ios
引用计数机制进行内存管理。程序员
retain对应的是release,内存的释放用release。安全
alloc对应的是dealloc,内存的销毁用dealloc。数据结构
readwrite此标记说明属性会被当成读写的,这也是默认属性。多线程
readonly此标记说明属性只能够读,也就是不能设置,能够获取。并发
assign不会使引用计数加1,也就是直接赋值。异步
retain会使引用计数加1。ide
copy创建一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。函数
nonatomic:非原子性访问,多线程并发访问会提升性能。性能
atomic:原子性访问。
strong:打开ARC时才会使用,至关于retain。
copy : 适用于接受了nscopy协议的对象类型
assign : 适用于通常类型
retain : 适用于通常对象类型
2.类变量的@protected ,@private,@public,@package,声明各有什么含义?
@protected 该类和全部子类中的方法能够直接访问这样的变量。
@private 该类中的方法能够访问,子类不能够访问。
@public 能够被全部的类访问
@package 本包内使用,跨包不能够
3.线程是什么?进程是什么?两者有什么区别和联系?
线程,有时称为轻量级进程,是被系统独立调度和CPU的基本运行单位。
进程是操做系统中能够并行工做的基本单位。
一个应用程序里至少有一个进程,一个进程里至少有一个线程
4.谈谈你对多线程开发的理解?ios中有几种实现多线程的方法
在一个进程中有多个线程,每一个线程有本身单独的任务 优势效率快缺点不安全,耗费资源
有三种: 第一种,使用@synchronized(self) 第二种,使用GCD 第三种,使用NSOperationQueue
5.线程同步和异步的区别?IOS中如何实现多线程的同步?
一个进程启动的多个不相干线程,它们相互之间关系为异步。
同步的话指的是多线程同时操做一个数据这个时候须要对数据添加保护这个保护就是线程的同步。
用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,若是任务1不完成,那么任务2就不会开始,这就是同步
6.假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理以后的输出结果为:aabcd
NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"aabcad"]; for (int i = 0; i < str.length - 1; i++) { unsigned char a = [str characterAtIndex:i]; for (int j = i + 1; j < str.length; j++) { unsigned char b = [str characterAtIndex:j]; if (a == b) { if (j == i + 1) { }else{ [str deleteCharactersInRange:NSMakeRange(j, 1)]; } } } } NSLog(@"%@", str);
7.获取一台设备惟一标示的方法有哪些?
1.UDID
2.UUID
3.MAC ADDRESS
4.OPEN UDID
5.广告标识符
6.Vindor标示符
ios7以后用的时keychain(钥匙串)
8.ios类是否能够多继承?若是没有,那能够用其余方法实现吗?简述实现过程。
没有 用catogory、extension来实现
Category也叫分类或类,主要做是为 没有源代码的类添加法 。经过Category添加的法会成为原类的部分。从达到扩展个类的功能。
Extension (延展)的主要做是管理类的“私有”法
9.堆和栈的区别?
堆须要用户手动释放内存,而栈则是编译器自动释放内存
堆栈的区别:
(1)管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生 memory leak。
(2)申请大小:能从栈得到的空间较小,堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于计算机系统中 有效的虚拟内存。因而可知,堆得到的空间比较灵活,也比较大。
(3)碎片问题:对于堆来说,频繁的new/delete势必会形成内存空间的不连续,从而形成大量的碎片,使程序效率下降。 对于栈来说,则不会存在这个问题,由于栈是先进后出的队列,他们是如此的一一对应,以致于永远都不可能有一个内存块 从栈中间弹出
(4)分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成 的,好比局部变量的分配。动态分配由 alloca函数进行分配,可是栈的动态分配和堆是不一样的,他的动态分配是由编译器 进行释放,无需咱们手工实现。
(5)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈 都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
10.ios本地数据存储都有哪几种方式? 1. NSKeyedArchiver(归解档) 2. NSUserDefaults 3. Write写入方式 4. SQLite3 5.coredata11. iOS动态类型和动态绑定、动态载入 IOS的动态类型(强类型)id 能够在代码运行时判断对象的类型。使用id类型(又称强类型)能够在运行的时候使用任何数据类型来替换。动态类型让程序更加灵活,但会使数据的统一性下降。咱们经常使用的静态类型如NSString等是有着本身的优点的,使用静态类型编译器能够彻底分析代码的性能,可预知性更高。 IOS动态绑定 能够在代码运行的时候判断须要调用什么方法。动态类型和动态绑定使得选择那个接收者以及调用哪一个方法均可以在运行时决定。 动态载入 应用能够根据须要加载可执行代码以及资源,而不是在启动时就加载全部资源。