一、协议(Protocols)

1. 声明协议

@protocol Foo <Xyzzy, NSObject>
// ...
@optinal
//
@required
//...
@end

(与@interface几乎一致)

-协议只是方法的声明,没有实现部分

-协议中声明的方法必须实现

加上@optional,其后的方法可选,其前的方法必须实现

加上@required,其后的方法必须实现

-如果你要实现协议Foo,也要实现Xyzzy协议和NSObject中全部必须的方法,

2. 指定协议

// 公有指定
#import "Foo.h"
@interface MyClass : NSObject <Foo>
// ...
@end // 私有指定
@interface MyClass() <Foo>
@end
@implementation MyClass
// ...
@end

3.用协议指定变量

id <Foo> obj = [[MyClass alloc] init]

4. 协议的使用场景

最常见的是:delegate 和 dataSource

视图向控制器发消息:通过 不可视结构化通信(blind structured communication)

@property (nomatomic, weak) id <UISomeObjectDelegate> delegate;
@property (nomatomic, weak) id <UISomeObjectDataSource> dataSource;

二、块(Blocks)

1. 在其他语言中,称为闭包(closure)

2. 加上__block后,变量在块中保存的不在是变量的值,而是变量的地址,所以可以被修改;

如果加上这个修饰,此变量会从栈移到堆中,从而可以在block中使用,等block结束,再将信息复制回堆,再放回到栈上;

3. 每次向block中的对象发送消息时,系统都会创建一个指向该对象的强指针,直至block不存在

4. block表现得像对象,体现在:

- 可以被存储,如存在property、dictionary、array中

- 可以被自动引用计数(ARC)统计

- 能接受的一个消息,就是复制(copy)

5. Memory cycle

解决办法:

创建一个weak版的self,然后block中用weakSelf

__weak MyClass *weakSelf = self;
[self.myBlocks addObject:^{
[weakSelf doSomeThing];
}]

6. block的用处

三、动画(Animation)

1、UIView Animation

frame、transform、alpha

+ (void)animateWithDuration:(NSTimeInterval)duration
delay:(NSTimeInterval)delay
options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion;
+ (void)transitionWithView:(UIView *)view
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion;

2、Dynamic Animation

UIDynamicAnimator

UIDynamicBehavior

UIGravityBehavior(重力)
UICollisionBehavior(碰撞)
UIAttachmentBehavior(吸附)
UISnapBehavior(捕捉)
UIPushBehavior(推动)

UIDynamicItem

Demo

Dropit(类似俄罗斯方块的小游戏)

CS193p Lecture 8 - Protocols, Blocks and Animation的更多相关文章

  1. CS193p Lecture 9 - Animation, Autolayout

    Animation(动画) Demo Dropit续 Autolayout(自动布局) 三种添加自动布局的方法: 使用蓝色辅助虚线,右键选择建议约束(Reset to Suggested Constr ...

  2. CS193p Lecture 11 - UITableView, iPad

    UITableView 的 dataSource 和 delegate dataSource 是一种协议,由 UITableView 实现,将 Model 的数据给到 UITableView: del ...

  3. CS193p Lecture 10 - Multithreating, UIScrollView

    Multithreating(多线程) 网络请求例子: NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithStrin ...

  4. CS193p Lecture 7 - Views, Gestures

    Views 如何绘制自定义图像 Gestures 如何处理用户手势操作 Views 1.它是基本的构造块,代表屏幕上一块矩形区域,定义了一个坐标空间,在此空间中可以绘制,可以添加触控事件: 2.它是分 ...

  5. CS193p Lecture 6 - UINavigation, UITabBar

    抽象类(Abstract):指的是这个类不能被实例化,只能被继承: OC中没有关键词来标明某个类是抽象类,只能在注释中标注一下: 抽象类中的抽象方法,必须是public的,使方法称为public的方法 ...

  6. CS193p Lecture 5 - View Controller Lifecycle

    1. UITextView @property(nonatomic,readonly,retain) NSTextStorage *textStorage 是 NSMutableAttributedS ...

  7. CS193p Lecture 4 - Foundation, Attributed Strings

    消息机制 调用一个实例(instance)的方法(method),就是向该实例的指针发送消息(message),实例收到消息后,从自身的实现(implementation)中寻找响应这条消息的方法. ...

  8. [C2P3] Andrew Ng - Machine Learning

    ##Advice for Applying Machine Learning Applying machine learning in practice is not always straightf ...

  9. Framework for Graphics Animation and Compositing Operations

    FIELD OF THE DISCLOSURE The subject matter of the present disclosure relates to a framework for hand ...

随机推荐

  1. bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】

    整体二分: 对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位 ...

  2. django框架知识3

    1.Django安装: 1.安装版本Django1.11.11 2.安装方式:命令行安装   pycharm安装 2.创建Django项目 1.创建方式:cd到你要创建的目录下  然后输入 Djang ...

  3. 新建Podfile命令

    接下来,你需要建立一个主工程.建立成功以后,再次启动终端, 利用cd命令进入到工程文件夹内,此时需要创建一个特殊的文本文件,命令如下: 命令: touch Podfile 创建 命令: open -e ...

  4. webSocket的学习以及问题的解决

    查过很多资料,感觉大部分都讲的不够详细,做为一个新人我从webSocket的基本开始学起, 首先webSocket的原理其实和Http差不多,但是由于Http只能被动的去向服务器请求消息,导致缺点太明 ...

  5. 区间质数查询 luoguP1865

    原题 https://www.luogu.org/problemnew/show/P1865 本来get到了一个很好的判断素数的方法 O(玄学常数)https://www.luogu.org/blog ...

  6. android okhttp和webview session共享

    public static OkHttpClient get(Context context){ OkHttpClient.Builder builder = new OkHttpClient.Bui ...

  7. NOI2012 D2T1扩展欧几里得

    #include <bits/stdc++.h> using namespace std; #define ll long long ll extgcd(ll a,ll b,ll & ...

  8. Ubuntu安装指定版本的docker

    系统环境: Ubuntu 16.0.4 安装版本: docker  17.03.2 在进现在这家公司初期,需要使用rancher部署一个k8s集群,由于rancher也是由docker启动的,加上k8 ...

  9. Hibernate save()、saveOrUpdate()、merge()的区别

    一. update 和 merge的区别 首先在执行更新操作的时候,两者都必须要有id update是直接执行update 语句,执行后状态为持久化状态 而merge则不一样: 1. 如果sessio ...

  10. 最长上升子序列 O(nlogn)

    题意:求一个序列中的最长上升子序列. 平常我用的是N*N做法,但是一遇到需要nlogn时,就被卡的无地自容了. 所以下定决心要学习nlogn做法. 如何实现nlongn哪? 这里要用到一个栈B,记录按 ...