iOS 之单例,代理,通知,KVO,Block全能解析
//单例
//.h
+ (Instannce *)shareInstance;
//.m
static Instannce *instance = nil;
@implementation Instannce
//定义一个创建单例对象的方法
+ (Instannce *)shareInstance {
if (instance == nil) {
instance = [[Instannce alloc] init];
}
return instance;
}
//使用alloc的时候调用的方法instancetype
+ (id)allocWithZone:(struct _NSZone *)zone {
if (instance == nil) {
instance = [super allocWithZone:zone];
}
return instance;
}
- (id)copy {
return self;
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
//返回无符号最大值
return UINT_MAX;
}
- (oneway void)release {
//什么也不做
} //代理
//.h
@protocol GetMessageProtocol <NSObject >
- (void)getNum:(NSString *)num withPassWord:(NSString *)pass;
@end
@property (nonatomic,assign) id<GetMessageProtocol> delegate;
//.m
if ([self.delegate respondsToSelector:@selector(getNum:withPassWord:)]) {
[self.delegate getNum:num.text withPassWord:passWord.text];
}
#pragma mark - GetMessageProtocol
- (void)getNum:(NSString *)num withPassWord:(NSString *)pass { }
registerCtrl.delegate = self; //通知 注意postNotificationName 必须一致
[[NSNotificationCenter defaultCenter] postNotificationName:NotificationName object:self userInfo:dic]; //dic存放在userinfo中 dic中存放要传过去的值是个字典
//接受通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeAction:) name:NotificationName object:nil]; //KVO监听
/*KVO观察者方法
keyPath: 监听的属性名
object: 被观察的对象
change: 属性值
context: 上下设备文
*/
[registerCtrl addObserver:self forKeyPath:@"属性名称1" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
[registerCtrl addObserver:self forKeyPath:@"属性名称2" options:NSKeyValueObservingOptionNew context:nil];
//触发的事件
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
//object的值是registerCtrl
if ([keyPath isEqualToString:@"属性名称1"]) { }else if ([keyPath isEqualToString:@"属性名称2"]) { }
}
//.h
@property (nonatomic, copy) NSString *属性名称1;
@property (nonatomic, copy) NSString *属性名称2;
//.m 必须通过setter方法改变值或者KVC //KVO方式
//触发的事件
[indexCollectionView addObserver:self forKeyPath:@"属性名称" options:NSKeyValueObservingOptionNew context:nil];
[posterCollectionView addObserver:self forKeyPath:@"pathIndex" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
//得到改变后的新值
NSInteger index = [[change objectForKey:@"new"] integerValue]; }
} //Block block的返回值 block的名称 block的参数
typedef void(^SucccessBlock)(NSString *); //Block的定义
@property(nonatomic,copy)SucccessBlock loginBlock; //block的声明 要用copy防止block的循环引用
_freindBlcok(friends); block的调用
[[MyXMPPManager shareManager] getFreind:^(NSArray *freinds) {} //block的赋值 实现
iOS 之单例,代理,通知,KVO,Block全能解析的更多相关文章
- iOS - 单例传值 (一)
点击打开链接 iOS - 单例传值 (二) 单例只会对某个类实例化一次/单例类,对单例这个类实例化一次有且仅有一个对象 你单例初始化,只能初始化一次,然后你指向的对象,其实都是指向一个内存地址, ...
- [iOS]封装单例类
[iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...
- iOS登录单例
iOS登录单例 一,工程图. 二,代码. UserInfo.h #import <Foundation/Foundation.h> @interface UserInfo : NSObje ...
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...
- iOS传值方式:属性,代理,block,单例,通知
正向传值均可,反向传值除属性传值不可,其余均可.下面简单介绍: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers ...
- iOS--页面间的代理传值(属性、代理(委托)、代码块、单例、通知)
(一)属性传值 (二)代理(委托)传值 代理传值 适用于 反向传值 (从后往前传) 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewController)中 1.2 创建协议类型的 ...
- Object-C知识点 (三) 单例 蒙版 刷新 KVO底层
#pragma mark - 单例方法(完整的方法) 系统的单例方法名称 sharedApplication defaultManager standardUserDefaults currentDe ...
- iOS 创建单例的两种方法
创建一个单例很多办法.我先列举一个苹果官方文档中的写法. [cpp] view plaincopy static AccountManager *DefaultManager = nil; + (Ac ...
- iOS:创建单例对象的两种方式
单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClas ...
随机推荐
- 分享:Android中利用机器码注册机制防止破解(转)
转自:http://blog.csdn.net/huzgd/article/details/6684094 最近做一个Android应用时遇到这个问题,客户要求功能必须注册才能使用,而程序本身又不是联 ...
- 【JavsScript】当 JavaScript 从入门到提高前需要注意的细节:变量部分
在javaScript中变量使用var声明的变量是当前作用域的变量,不使用var声明的则肯定是全局变量. http://msdn.microsoft.com/zh-cn/library/dn64545 ...
- 你所不知到的C++ 系列
http://blog.csdn.net/doon/article/category/2926337
- apache htaccess
#RewriteCond :重新条件#RewriteRule : 重写规则# .htaccess文件中的规则会以它们出现的顺序被处理 <IfModule mod_rewrite.c>Rew ...
- Laravel 5.0 之命令及处理程序
本文译自 Matt Stauffer 的 系列文章 . 本文中涉及的新功能都是关于 Commands 的,这些特性在 Laravel 旧版本中已经有了,但是在 Laravel 5.0 中变得更加好用了 ...
- Quartz 设置一个半小时任务实现
该文章属于本人原创,转载请注明出处. spring + Quartz 设置定时任务时要求没一个半小时执行一次 设置两个相同的定时任务 第一个从整点开始每三小时执行一次 ...
- 请谨慎使用 @weakify 和 @strongify
来源:酷酷的哀殿 链接:http://www.jianshu.com/p/d8035216b257 前言 相信大部分见过 @weakify 和 @strongify 的开发者都会喜欢上这两个宏.但是很 ...
- BootStrap2学习日记17---导航路径和分页
导航路径 代码: <ul class="breadcrumb"> <li><a href="#">Home</a> ...
- CNZZ每天百亿条日志写入,SLS+ODPS轻松拆招
如果你是一个站长,想要提交一个查询,从一亿多条日志中找出从湖南省发出.使用ISP电信.通过百度搜索跳转到达的访问日志.该怎么做? 别急,在接收到您的查询条件后,CNZZ可以快速通过SLS(简单日志服务 ...
- ASP.NET页面与IIS底层交互和工作原理详解(第二回)
引言 在 Part.1 Http请求处理流程 一文中,我们了解了Http请求的处理过程以及其它一些运作原理.我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpMod ...