单例,通知,KVO, 代理协议
单例:创建一个单独的类,用来存储要传递的值。只创建一次的类对象,在该类中进行设定,使其只创建一次。
UserInfo.h:
static userInfo *userInfo = nil
@implementation UserInfo
//method 1
+ (UserInfo *)shareInfo
{
if(userInfo == nil)
{
userInfo = [self alloc] init];
}
return userInfo;
}
//method 2 gcd创建单例
+ (UserInfo *)shareInfo_GCD
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
userInfo = [[self alloc] init];
});
return userInfo;
}
@end
2.通知
[NSNotificationCenter defaultCenter];//通知中心
发送通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@“valueChange” object:nil];
object为可传递的参数,利用其传递参数,对象
添加监听,在接受方法中
[NSNotificationCenter defaultCenter] addObserver:self selector(@selector(nameAndPwd:) name:@“valueChange” object:nil];
- (void)nameAndPwd:(NSNotification *)notification
{
NSDictionary *dic = notification.object;//获取传递过来的参数
….
}
移除通知
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
KVO模式—Key Value Observer
通过set方法赋值才能触发,直接赋值不会触发,如_qqnumber = 333;不会触发;
self.qqnumber = 333,会触发。
reg = [[RegistViewController alloc] init];//
写到init方法中,使reg只创建一次。
[reg addObserver:self forKeyPath:@“passWord” options:NSKeyValueObservingOptionNew content:NULL];
- (void)observeValueForKeyPath:(NSString *)KeyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context//系统提供的方法
KeyPath:监听的属性名
object:监听的对象
change:监听属性的值
context:添加监听时传来的值
{
if([KeyPath isEqualToString:@“qqNumber”]){
NSString *userInfo = [change objectForKey:@“new”;//获取新值
}
}
KVC—Key_Value_Coding,键值编码,用于修改属性的值,如果属性是有对应的set方法,那么会优先调用set方法,如果没有,会强行赋值
[self setValue:qqText forKey:@“…”];
添加移除方法
- (void)dealloc
{
[reg removeObserve
}
kvo是主动监听,而notification是被动接受被监听者发送过来到通知。
kvo的话,可以监听多个属性。
通知在任何地方都可以接受通知发送过来到消息。
通知不涉及具体的类。
kvo > delegate > notification > 单例
协议:自己定义的协议,别人来实现,代理对象。
在代理文件中
在这里面
实现代理中的方法
registerView *reg =[ [registerView alloc] init];
reg.delegate = self;
一定是
xxx.delegate = self; 的形式
在主文件中
在这里面
声明需要实现的方法
@protocol …
@end
@property ..id <registerDelegate> delegate;
典型函数
if([self.delegate respondsToSelector:@selector(registerQQNumber:withPassWord:)])
{
[self.delegate registQQNumber:qqText withPassWord:passText];//该步会去调用代理中实现的协议方法,这一步相当于去向代理对象中实现参数的传递。
}
[self.delegate …//协议中的函数];//让self.delegate去实现代理方法
if([object isKindOfClass:[PosterCollectionView class])
创建indexPath位置
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:..];