1. 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
引用计数机制进行内存管理。
retain对应的是release,内存的释放用release。
alloc对应的是dealloc,内存的销毁用dealloc。
readwrite此标记说明属性会被当成读写的,这也是默认属性。
readonly此标记说明属性只可以读,也就是不能设置,可以获取。
assign不会使引用计数加1,也就是直接赋值。
retain会使引用计数加1。
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.堆和栈的区别?
堆需要用户手动释放内存,而栈则是编译器自动释放内存
10.ios本地数据存储都有哪几种方式? 1. NSKeyedArchiver(归解档) 2. NSUserDefaults 3. Write写入方式 4. SQLite3 5.coredata 11. iOS动态类型和动态绑定、动态载入 IOS的动态类型(强类型)id 可以在代码运行时判断对象的类型。使用id类型(又称强类型)可以在运行的时候使用任何数据类型来替换。动态类型让程序更加灵活,但会使数据的统一性降低。我们常用的静态类型如NSString等是有着自己的优势的,使用静态类型编译器可以完全分析代码的性能,可预知性更高。 IOS动态绑定 可以在代码运行的时候判断需要调用什么方法。动态类型和动态绑定使得选择那个接收者以及调用哪个方法都可以在运行时决定。 动态载入 应用可以根据需要加载可执行代码以及资源,而不是在启动时就加载所有资源。