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 ...
随机推荐
- 【JavaScript】XMLHttpRequest Level2使用指南
XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信. 最早,微软在IE 5引进了这个接口.因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生. ...
- [Node.js] Configuring npm package.json scripts
With a node package manager's (npm) package.json script property, you can preconfigure common tasks ...
- 直接对寄存器操作,实现usart的串口输出寄存器的配置
就像前面提到的,我用的板子是一款stm32f107系列的板子,在这块板子上,已经开发出了一套比较成熟的库函数,这也就意味着你可以不用直接去操作存储器来实现某些功能.比方说对于USART来说可以直接通过 ...
- 性能监视器(SSAS)
使用性能监视器,您可以通过性能计数器监视 Microsoft SQL Server Analysis Services (SSAS) 实例的性能. 性能监视器是用于跟踪资源使用情况的 Microsof ...
- 微信js接口自定义分享内容
最近客户有个要求,需要给网页添加微信分享功能,当然指的是用微信自带浏览器的时候,希望用户在最后一页点击分享的时候是分享的首页.曾经无意中看到过微信公众开发者平台提供了js接口,所以试着做了做,果然,跌 ...
- chrpath工具使用
转载:http://www.cnblogs.com/kungfupanda/p/3708799.html chrpath是用来改变程序的depends lib 的搜索路径的,比如我们一般使用$ldd ...
- WPF 之 TreeView右键选中节点及节点重命名
下面的TreeView节点是通过数据双向绑定的方式,绑定到TextBlock控件和TextBox控件的Text属性上,并且让两者绑定相同的属性,同时使TextBox控件刚好完全覆盖TextBlock控 ...
- A problem is easy
描述When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’ ...
- IOS 沙盒机制 && 关于document\library\tmp的灵活使用
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件Documents:苹果建议将程序中建立的或在程序中浏览到的文件数 ...
- Laravel自学第一课:laravel下载与安装
本地安装laravel,php环境要配置好,推荐xmapp一键搭建. 1.程序包直接从官方下载,官方开源地址:https://github.com/laravel/laravel(当然也可从此网站:h ...