ios面试题

如何实现对象的交互

,在数据中无非就是数据的发送者和接受者,,我们通过代理进行通信,或者通过观消息模式

2.如何对产品进行多语言发布

除了h和m 文件不能对发布外,其他的都可以多语言支持

线程同步的

MutexLock 互斥锁和条件锁消息传递

UDP和TCP

TCP是条件传输控制协议,是连接的,可靠的、点到点的

udp 是用户数据包协议 非连接,不可靠,可以一点对多点的协议

如何选择,看程序的的注重点

TCP/IP连接的过程

TCP/IP是三次握手

1.建立连接,客户端发送连接请求道服务器,并进入SYB_SEND(syb_send)等待服务器确认

2.服务器收到客户端的连接请求,并向客户端发送允许连接应答,此时服务器进入syn_recv状态

3.客户端收到服务器的允许连接,向服务器确认,客户端向服务器端进行通信

就是进行三次连接信息的发送和接受过程

全局变量可不可以定义在多个c文件包含的头文件中

可以,在不同的c 文件中,以不同的static 形式来命名同名全局变量,前提是其中只能有一个c文件对此全局赋初值

如何引用一个已经定义过的全局变量

1.用头文件的方式,,假如那个变量写错了,编译期间会报错 2.也可以用extern关键字,编译期间不会报错,而在连接的时候会报错

什么叫数据结构

计算器存储和组织数据的方式 是相互存在的一种或多种特定关系的数据元素的集合

保存数据有哪几种方式

数组,自定义类,文件操作,数据持久化(偏好设置、plist coredate SQlite ,归档和反归档)

sizeof 和strlen

sizeof()是运算符,可以用类型做参数也可以用函数做参数,

strlen()是函数,运算时才能计算,参数必须是字符行指针,必须以\0结尾,功能是返回字符串的长度

什么是抽象类

在c++中,含有纯虚拟函数的类,在java 中,含有抽象方法的类,只是做基类的,不能实例化

@interface 声明一个类

和@property 声明的是两个函数,Getter和setter,编译器会自动生成2个函数

do while 和while do

do while 是先执行后判断,条件不满足也执行一次

while do 是先判断后执行,条件不满足也执行一次

几个死循环

while (1) {}、

for (;;){}

用预处理#define声明一个常数,用表明一年有多少秒

#define SECONS——PER_YER (60*60*24*365)UL

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

assign 普通语言的赋值,不改变计数器

retain 是保存一个对象需要拥有的对象,拷贝指针,引用计数器+1,并用release计数器减1

copy 是NSString ,内容拷贝 拷贝之前会释放旧的对象,并且开辟内存空间在栈中

retain对其他NSObject 和其他子类

readonly,是只读,只生成Getter方法,不生成setter方法,在@implementation ,中只需要一个读取器,在#synthesize 关键字,有读取方法被解析

read write 设置可供访问级别, 设置器和读取器都需要@implementation实现,在使用@synthesize关键字,都被解析

nonatomic 非原子访问,对属性赋值时,不加锁,多线程并发访问提高性能

aotomic 和nonaotomic 是决定编译器生成Getter和setter是否是原子操作,在多线程,原子操作是必要的,否则引起错误

weak和Strong,是在ARC的情况下使用,,用weak相当于assign而Strong相当于retain

只有一种情况下需要使用weak ,就是就是父类含有子类,而子类又调用父类,声明weak的指针,指针一旦被释放,这些地址就为nil ,这样有效的防止了野指针,

(1)在拖线操作中使用weak,(2delegate中使用weak),一般来说,类的外部用weak

Strong,在类的内部用Strong

UIResponder触摸处理 touchBegintouchEnd nextResponder

const 是只读,用来保护那些不希望被改变的参数,防止其被其他恶意代码修改

_block 和_weak 修饰的区别

_block 在ARC 和MRC都可以用,可以修饰对象也可以修饰基本数据类型,可以在block 中重新赋值,

_weak 只能在ARC模式下使用,只能修饰对象NSString ,不可以修饰基本数据类型int

tableView滑动卡的原因,在缓冲或者本地读取图片的UIImage 的时候耗费了时间,需要把放在子线程

NSData*imagData=[NSData dataWithContentsOfURL :[NSURL URLWithSTring:app.icon]]

UIImage*image=[UIImage iamgeWithData:imgData];放到主线程

把UIImage赋值给图片的时候在主线程,子线程不能更新UI,所有的UI更新都在主线程,这样就造成主线程卡

在子线程假如NSTimer的时候需要手动添加NSRunLoop,否则不能循环

单例中添加MutabelArray的时候,防止多个地方对他同事便利和修改,需要加上原子属性,并且用Strong

_weak viewController*weakSelf=self;

GCD里面用_weak防止内存释放不了,循环引用

SDWebImage的原理:先从内存中查找是否有图片,如果有图片缓存,就展现,如果没有就回调下载

UIButton的父类是UIController—>UIView->UIResponder

100以上是连接成功200以上是正确 ,302是请求重定向,400以上是连接错误或者找不到服务器,500以上是服务器错误

HTTP是请求《—》响应模式客户端《—》服务器发送请求

dispatch_async

dispatch_Group_async

dispatch_barrier_async

dispatch_apply

static 关键字的作用

在函数体内static变量的作用范围为该函数体,被内存分配一次空间,所以下次调用时,还是维持上次的值

static 在模块内全局变量、函数,可以在整个模块内使用,不能在模块外使用

static 成员变量属于整个类所拥有,对象的所有值只有一份拷贝,只能访问类的static成员变量

进程和线程

进程和线程都是操作系统下的程序运行的基本单元,不同的是,有不同的操作系统管理方式,进程有独立的地址空间,如果一个进程奔溃,不会影响其他进程,而线程只是一个进程中不同执行路径,线程有自己的的堆栈和局部变量,多进程比多线程健壮,但是进程切换时耗费资源大,效率低,对于一些要同时操作并共享某些变量的,只能用线程,不能用进程

堆和栈的区别

栈是由编译器自动管理,堆是由程序员自己控制

栈是由低地址拓展的数据结构,是一块连续的内存区域,在window下栈的大小是2M,获取的空间小,先进进出,不会造成效率低,可以静态、动态分配,效率高

堆,是高地址拓展的数据结构,是不连续的,获取的空间大,可能造成大量碎片,造成程序效率降低,动态分配的,是由函数库分配

键—值

目标—动作机制

目标是动作消息的接受者,一个控件,保有其动作消息的目标

动作是控件发送目标的消息,或者说是响应目标而实现的方法

OC的内存管理

,如果你通过分配和初始化的方式创建对象,你就拥有这个对象,需要对该对象进行释放,如果你拷贝一个对象,你就拥有拷贝的对象,需要负责该对象的释放;如果你保持一个对象,就拥有了该对象的部分,需要不在使用的情况下进行释放,如果你从其他对象接收对象,则你不拥有对象 ,你就不应该释放他

自动释放池的作用

类工厂方法

向客户提供方便,他们将分配和初始化合在一个步骤中,返回被创建的对象,并自动释放处理+(type)className使类提供单件实例,可以避免盲目分配内存

OC的优缺点

1.category2.posing3.动态识别 4.指针计算 弹性讯息传递可以进行c++混编不是一个过度复杂的c衍生语言

缺点 1.不支持命名空间 不支持运算符重载 不支持多重继承

strcpy 是字符串拷贝的函数。它的函数原型是strcpy ,以\0结尾,由于拷贝的长度不是由我们决定,所有容易出错

memcpy 是内存拷贝,长度可控,但是可能存在内存叠加的问题

sprintf是格式化函数,,长度不可控,可能会造成溢出

什么时候用delegate,什么时候用notification

delegate是one—to —- one并且将返回值给sendernotification是one—to —one /many ..无法将返回值给sender,所有呢delegate,希望得到返回值,而notification,只是简单的通知

kvc是一个对象都在调用setValue的时候。首先是根据方法名找到所需要运行的环境参数——》根据isa 指针结合环境参数,找到具体实现的借口—》再直接查找的来的具体的方法实现


http://zhangmingwei.iteye.com/blog/174843118

你可能感兴趣的:(ios面试题)