iOS 面试要点二

回调机制

1)目标动作:当两个对象之间有比较紧密的关系,如视图控制器与其下的某个视图;

2)代理:委托,当某个对象收到多个事件,并要求同一个对象来处理所有事件时,委托机制依赖于某个协议定义的方法来发送消息

3)通知机制:当需要多个对象或两个无关对象处理同一个事件时

4)block:适用于回调只发生一次的简单任务


堆和栈的区别?

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

申请大小:栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域

                   堆:是向高地址扩展的数据结构,是不连续的内存区域。

分配方式:堆都是动态分配的 ,动态分配由alloca函数进行分配 

                   栈的动态分配由编译器进行释放,无需我们手工实现 



线程和进程的区别?

答:主要不同的是操作系统资源管理方式

线程是一个进程中不同的执行路径,线程有自己的堆、局部变量

进程有独立的地址空间,一个线程死掉,整个进程就会死掉



单例模式

一个类只有一个实例


(1) static id _dataTool;//创建一个全局实例,用static保护起来;

(2) + (instance)allocWithZone:(struct _NSZoene *)zone;

(3) + (instance)sharedDataTool;

(4) - (instance)copy;


内存管理的几条原则

谁申请谁释放


new alloc copy


创建线程的方法

NSThread, 使用GCD的dispatch,使用子类化的NSOperation,

主线程 dispatch_async(dispatch_get_mainThread...)



KVC key-value-code 键值编码,通过指定 表示要访问的 属性名字的字符串,进行属性的读取和设置

KVO 键值监听,监听属性的变化



1、用预处理指令#define声明一个常数,用以表明1年的秒数(365天)


# define SECONDS_PER_YEAR  (365*24*60*60)UL


末尾加UL,16位机的整形数会溢出,因此要加L,UL无符号整型


2、写一个标准宏MIN,输入两个参数并返回较小的一个

define MIN(A,B)  ((A)>(B)?(B):(A))


3、写一个委托interface


@protocal MyClassDelegate //NSObject为基本类根类也为基协议,可以写也可以不写


@optional  //@required


- (void) doSomething;


@end


@interface MyClass: NSObject


@property(nonatomic, weak) id delegate;


@end


4、

没有多重继承,委托,类别和扩展来实现



9、const, 只读,常,保护哪些不希望被改变的参数,加const 类的成员函数,表明其实一个常函数,不能修改类的成员变量;


static 局部变量,变量只需初始化一次,它的生命周期和全局变量一样,作用域只能是函数内部;

static 全局变量 , 避免该变量被其他文件用extent引用修改;

static函数

在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。


extern "C"后,会指示编译器这部分代码按C语言的进行编译,


10、volatile 易改变的,每次使用一个变量总是重新读取这个变量的值,而不会从寄存器读取备份的:


并行设备的硬件寄存器;

一个中断服务子程序中会访问到的非自动变量

多线程应用中被几个任务共享的变量


11、#import 引入头文件,避免头文件被重复引用,OC

#include 引入头文件,不能避免头文件被重复引用

@class 声明,没有引入头文件


12、MVC模式

M: Model 数据,数据来源,数据模型

V: View 视图,与用户交互的视图界面

C: Controller 控制器 总管家

控制器作为总管家,数据和视图不要跳过C直接通信;

M和C,C可以直接读取M的数据,M可以通过通知和KVO机制与C进行通信;

M和V,M通过outlet修改V的数据,V通过action来与C通信,按钮的点击事件等等


13、线程与进程的区别和联系

进程:系统中正在运行的程序,一个进程至少有一个线程,进程有独立的空间,一个进行奔溃,在保护模式下不会对其他进程有影响

线程:进程的一次任务执行,同一个进程的线程共享进程的资源



15、堆和栈的区别

栈是由编译器自动管理,

堆,释放需要程序员控制,容易产生内存泄露


16、键值

key value


KVC 键值编码,通过字符串的访问属性,

键路径,点分割,指定任意深度的路径,使其指向相关对象的特定属性


17、目标-动作机制

目标是动作消息的接受者


18、cocoa touch 框架

iPhone 开发的基础框架,UIKit,实现图形,事件驱动程序

图形和动画, 音频视频,网络


23、单例模式

一个类只有一个实例

static id _soundTool;


+ (instancetype) allocWitchZone: (struct _NSZone *)zone {

//避免重复加锁

//加锁

//避免多线程

if  (_soundTool == nil){

@synchronized(self){

if(_soundTool == nil){

_soundTool = [super allocWithZone:zone];

}


}

}

return _soundTool;

}


+ (instancetype)  sharedSound {

dispatch_once_t...

_soundTool = [[super alloc]init];

....

return _soundTool;

}


- (instancetype)  copy {

return _soundTool;

}



24、动态绑定

在objective-c中,调用指定的方法不是由编译器决定而是由运行时决定,这被称作是方法的动态绑定


25、OC优缺点

类别:添加新的方法

动态识别:属性和方法不是由编译器决定而是由运行时决定的


缺点:

不支持命名空空间;

不支持运算符重载

不支持多重继承


27、

int a;

int *a;

int **a;

int a[10];

int *a[10];

int (*a)[10];//一个指向10个整型数数组的指针

int (*a)(int);//一个指向函数的指针

int (*a[10])(int);


28、

assign setter方法直接赋值,不进行任何retain操作,

retain release旧指,retain新值

copy  release旧指, copy新值

nonatomic,非原子2,不加锁,iPhone开发


29、UITableView

dataSource

@required

行数

设置cell

@optional

组数


delegate:

选中cell触发

设置行高

你可能感兴趣的:(iOS 面试要点二)