1、分类category和协议Protocol
协议定义了一组方法,可用于处理id类型的对象。例如:id <MyProtocol> obj;MyProtocol被定义为一组方法。
(1)分类category:
分类可以以模块化的方法向类中添加新的方法,使用分类对类进行扩展不需要访问该类本身,也无需对其进行派生。
定义category:在Xcode中选择新建一个objective-c分类,则会生成一组.h和.m文件,以类名+分类名命名;如下图所示:
该图显示了一个名为aCategory的分类对BaseClass类的扩展;在category的头文件和源文件中可以分别声明和实现相应的方法。
个人认为,分类中定义的方法和类本身实现的方法并没什么本质的区别,只是分类中实现的方法可以认为是动态绑定方法,在运行时调入。
(2)协议protocol
协议是在多个类之间可以共享的方法列表,这些方法在定义的时候只有声明却没有实现(其代码只有头文件没有源文件),如下图所示。其实现应该由采用该协议的类完成,其中包括必须实现方法和可选择实现方法。协议可以继承别的协议,但是不能在协议中定义成员变量。
协议的实现需要在采用该协议的类的继承关系之后,用<aProtocol>表示。
两个重要协议:<NSCopying><NSCoding>;
#ios中应用协议最广泛的地方便是代理(delegate)和数据源(datasource);
当一个类的实例对象希望完成某个特定的、不属于此类对象常用的方法时,从该类派生出一个新类是比较低效率的;相反,比较高效的方法便是使用代理。数据源的作用是将视图类同数据联系,因为数据不是视图的一部分,视图不拥有数据。
2、程序块blocks
block是一块代码,在{}之间的代码段。block可以作为一个函数的参数传递。
block可以在内部使用在之前定义的变量,但是这些变量是只读的,除非在定义这些变量时在前面加上__block。
使用场景:枚举enumeration、视图动画、通知、错误处理、动作完成处理等,最重要的一点即多线程操作。
对于block的更多细节将会在未来详述。
3、动画效果——视图的动画效果、视图控制器的动画效果、core animation框架;
#通过改变视图的属性制造动画效果:frame——尺寸、transform——平移、缩放和旋转、alpha——透明度;
实现方法:
(1)UIView类方法和block
+ (void) animationWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval))delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
调用时,视图属性的变化瞬时发生,但是其显示通过动画效果逐渐显现。
视图间转换的动画效果:
+ (void)transitionFromView:(UIView*)fromView toView:(UIView*)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;
(2)动态动画:为各个视图定义相应的物理运动,并让其执行;
步骤:创建UIDynamicAnimator->添加UIDynamicBehaviors->添加UIDynamicItems。
如下程序段所示:
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:aView]; UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init]; [animator addBehavior:gravity]; UICollisionBehavior *collider = [[UICollisionBehavior alloc] init]; [animator addBehavior:collider]; id <UIDynamicItem> item1 = ...; id <UIDynamicItem> item2 = ...; [gravity addItem:item1]; [collider addItem:item1]; [gravity addItem:item2];