如何实现对象的交互
,在数据中无非就是数据的发送者和接受者,,我们通过代理进行通信,或者通过观消息模式
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
’