1.事件响应(responder chain)
只有继承了UIResponder的类才能响应touch事件,先是最上层的view响应事件,如果该view有视图控制器的话会是下一个响应者,否者就是该view的父视图,这样至上而下传递事件。直到单例UIWindow对象,最后是单例UIApplication对象以终止,UIApplication的下一个响应者是nil,已结束整个响应循环。事件在传递过程中视图可以决定是否需要对该事件进行响应。
事件分发(Event Delivery)
第一响应者(First responder)指的是当前接受触摸的响应者对象(通常是一个UIView对象),即表示当前该对象正在与用户交互,它是响应者链的开端。整个响应者链和事件分发的使命都是找出第一响应者。
UIWindow对象以消息的形式将事件发送给第一响应者,使其有机会首先处理事件。如果第一响应者没有进行处理,系统就将事件(通过消息)传递给响应者链中的下一个响应者,看看它是否可以进行处理。
iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view。
UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是要找的hit-test view。
hitTest:withEvent:方法的处理流程如下
首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;
若返回NO,则hitTest:withEvent:返回nil;
若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;
若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;
如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。
2.nil,NSNULL,NULL区别
nil是指向obj-c中对象的空指针,是一个对象,在o-c中ni对象调用方法不会引起crash。
Nil是指向obj-c中的类的空指针,表示的是一个空类。
NULL是指向任何类型的空指针(如c/c++中的空指针),在objective-c中是一个数值。
NSNULL用于集合操作,在集合对象中,表示一个空值的集合对象。
3.NSThread,NSOperation,GCD
NSThread,NSOperation,GCD是IOS中使用多线程的三种方式之一。他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。
NSThread,缺点:需要自己维护线程的生命周期和线程的同步和互斥,但是这些都需要耗费系统的资源。优点:比其它两个更轻。
NSOperation,优点:不需要自己管理线程的生命周期和线程的同步和互斥等。只是需要关注自己的业务逻辑处理,需要和NSOperationQueue一起使用。
GCD,是Apple开发的一个多核编程解决方法,优点:比前面两者更高效更强大。
4.NSRunLoop 和NSOperationQueue
NSRunLoop 是所有要监视的输入源和定时源以及要通知的注册观察者的集合.用来处理诸如鼠标,键盘事件等的输入源。每一个线程拥有自己的RunLoop有系统自动创建。你不应该自己去创建,只能获取。一般不会用NSRunLoop,因为它不是线程安全的。一般都用CFRunLoop,这个是线程安全的,是一种消息处理模式,我们一般不用进行处理。
NSOperationQueue时一个管理NSOperation的队列。我们会把NSOperation放入queue中进行管理。
5.autorelease ,ARC 和非ARC
autorelease 自动释放,与之相关联的是一个自动释放池(NSAutoReleasePool).autorelease的变量会被放入自动释放池中。等到自动释放池释放时(drain)时,自动释放池中的自动释放变量会随之释放。ios系统应用程序在创建是有一个默认的NSAutoReleasePool,程序退出时会被销毁。但是对于每一个RunLoop,系统会隐含创建一个AutoReleasePool,所有的release pool会构成一个栈式结构,每一个RunLoop结束,当前栈顶的pool会被销毁。
ARC,自动应用计数。(iOS 6加入)IOS内存管理是基于变量的应用计数的。这样系统帮你管理变量的release,retain等操作。
非ARC,非自动应用计数。手动管理内存。自己负责系统变量的release,retain等操作。做到谁分配谁释放,及alloc和release像对应。函数返回对象时使用autorelease。
可以使用Xcode将非ARC转化为ARC,ARC和非ARC混编。可在在编译ARC时使用-fno-objc-arc,-fobjc-arc标签。实际需要看工程是支持还是不支持ARC模式。
6.生命周期函数
loadView,
viewDidLoad,
ViewDidUnload,
viewWillAppear,
viewDidAppear,
viewwilldDisappear,
viewDidDisappear
当view的nib文件为nil时,手动创建界面时调用loadView,当view的nib文件存在时,会在viewDidLoad中实现。但是当你的程序运行期间内存不足时,视图控制器收到didReceiveMemoryWarning时,系统会检查当前的视图控制器的view是否还在使用,如果不在,这个view会被release,再次调用loadView来创建一个新的View。viewDidLoad ,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。但是如果改view在栈中下一次显示是不会被调用。ViewWillAppear,ViewDidAppear会在view每次即将可见和完全显示时都会调用。我们会在ViewWillAppear里面进行一些view显示的准备工作,ViewDidDi sappear 和ViewWillDisAppear时会在view每次消失时都会调用。当系统收到didReceiveMemoryWarning通知时显示内存不足时,会调用ViewDidUnload来清理View中的数据和release后置为nil。
7.内存管理和优化
原则:
1.1 谁创建,谁释放(类似于“谁污染,谁治理”)
如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。
1.2 除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
1.3 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。
优化:
在收到内存didReceiveMemoryWarning的警告时,释放掉一些不再需要的资源,注意编码规范,如一些变量不使用需要及时的释放。避免是占用太多的内存空间,有时需要用空间去换取时间,尽量使用一些高效的算法和数据结构节约内存空间。最后使用一些内存检测工具和代码的静态分析查找内存泄漏和分配(instrument,leaks,allocations)。
8.NSArray可以放基本数据类型不(int,float,nil)怎么放进一个结构体
NSArray 只能存放objective-c对象数据模型,这些基本数据类型需要先转化为NSNumber对象再存放进数组中。
9.opengl,quatarz 2d
上面2种方式是进行图形绘制会使用到的技术。
quatarz 2d 是Apple提供的基于Core graphic的绘制基本图形工具库。操作简单方便,能够满足大部分需要。只是适用于2D图形的绘制。
opengl,是一个跨平台的图形开发库。适用于2D和3D图形的绘制。功能强大但是复杂。
10. animation
IOS提供丰富的Core Animation动画满足用户的需要,主要实现方式如下3种:
1.1 commitAnimations方式使用UIView动画
UIView Animations 动画:
[UIView beginAnimations:@"animationID" context:nil];
[UIView setAnimationDuration:0.5f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationRepeatAutoreverses:NO];
//以下四种效果
/*
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];//oglFlip, fromLeft
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];//oglFlip, fromRight
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
*/
//你自己的操作
[UIView commitAnimations];
1.2、CATransition
CATransition *animation = [CATransitionanimation];
animation.duration = 0.5f;
animation.timingFunction =UIViewAnimationCurveEaseInOut;
animation.fillMode = kCAFillModeForwards;
animation.type = kCATransitionMoveIn;
animation.subtype = kCATransitionFromTop;
[self.window.layeraddAnimation:animationforKey:@"animation"];
//自己的操作
1.3、UIView animateWithDuration
方法:
+(void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; //多一个动画结束后可以执行的操作.
示例如下:
[UIView animateWithDuration:1.25 animations:^{
CGAffineTransform newTransform = CGAffineTransformMakeScale(1.2, 1.2);
[firstImageView setTransform:newTransform];
[secondImageView setTransform:newTransform];}
completion:^(BOOL finished){
[UIView animateWithDuration:1.2 animations:^{
//自己的操作} completion:^(BOOL finished){ 自己的操作}];
}];
11.添加手势的方式(gesture和touches事件)
1.自己重载实现touchMoved,touchBegin,touchEnd,touchCanceled事件。
2.通过UIGestureRecongnizer添加AddGestureRecognier事件。该方式方便添加一些诸如点击,双击,拖动等基本的手势事件。
1万+

被折叠的 条评论
为什么被折叠?



