OC 07 设计模式
来源:互联网 发布:js在线解压缩工具下载 编辑:程序博客网 时间:2024/06/06 00:08
属性和方法传值
Login.h文件
#import<Foundation/Foundation.h>
@interfaceLogin : NSObject
@property(nonatomic, copy) NSString *loginerName;
@end
User.h文件
#import<Foundation/Foundation.h>
@classLogin;
@interfaceUser : NSObject
@property(nonatomic, retain) Login * loginer;
-(void)getNameOfLoginer:(Login *)loginer;
-(void)test;
@end
User.m文件
-(void)getNameOfLoginer:(Login *)loginer{
NSLog(@"%@",loginer.loginerName);
}
-(void)test{
NSLog(@"%@",single.loginer.loginerName);}
Main.m文件中
Login *loginer = [[Login alloc] init];
loginer.loginerName = @"大神";
User *user1 = [[User alloc] init];
//属性
user1.loginer = loginer;
[user1 test];
//方法
[user1 getNameOfLoginer:loginer];
单例模式
单例:对象,实例
特点:唯一的一个实例
生命周期和程序的生命周期一样
全局,任何地方都可以访问
不能被销毁
只会初始化一次
单例的创建步骤
1.首先创建一个UserCenter类
2.在.h文件中:
@interface UserCenter : NSObject
//单例:以default,share,standard,getinstance开头
+ (UserCenter*)standardUserCenter;
//创建返回一个单例实例化对象,只分配一次内存,无法销毁,可以在任何地方使用
//保存的信息
@property (nonatomic, copy) NSString *name;
@end
.m文件
//声明一个全局单例对象
staticUserCenter *instance = nil;//不能让外部访问,同时放在静态块中的
+(UserCenter *)standardUserCenter {
if (!instance) { //保证第一次创建成功后不再新建对象
instance = [[UserCenter alloc] init];
}
return instance;
}
我们还需要一些准备工作,创建一个Student类,在Student.m文件中,导入#import "UserCenter.h",然后重写父类init方法
- (instancetype)init {
self = [super init];
if (self) {
//获取用户信息
NSString *name = [UserCenterstandardUserCenter].name;
NSLog(@"%@", name);
}
return self;
}
main.m
UserCenter *userCenter = [UserCenterstandardUserCenter];
[userCenter setName:@"yaya"];
Student *student = [[Student alloc] init];
//打印信息:yaya
//完整单例的实现
//声明一个全局单例对象
static UserCenter *instance = nil;
+ (UserCenter *)standardUserCenter{
if (!instance) { //保证第一次创建成功后不再新建对象
instance = [[UserCenter alloc] init];
}
return instance;
}
//重写alloc方法
+(instancetype)allocWithZone:(struct _NSZone *)zone {
if (!instance) { //保证第一次能够创建一个对象
return [super allocWithZone:zone];
}
return nil;
}
//release,
- (oneway void)release{
//将引用计数-1,但是我不让你-,万一引用计数为1,1-1= 0,内存就销毁了,但是我这块内存是不销毁,所以我就什么都不做,oneway,单项操作,没什么特别的
}
//autorelese,
- (instancetype)autorelease{
return self;//不让你-
}
//copy,
- (id)copyWithZone:(NSZone *)zone{
//不让你去开辟空间
return self;
}
//retain
- (instancetype)retain{
return self;
}
//retainCount
- (NSUInteger)retainCount{
return NSUIntegerMax;//无穷大-1,打印常量字符串,就不会去-1
}
观察者模式
观察者模式:kvo(设计模式,观察者模式的一种,kvo是基于kvc的一种模式,所以我们先了解kvc,kvc(key-valule-coding键-值-编码)),notification
键值编码中基本调用包括两个方法:
-valueForKey:
-setValue:forKey:
接下来我们在代码示
//kvc
// KVC设置值时,如果属性有set方法,则优先调用set方法,如果没有则直接设置上去,get方法一样
Person *per = [[Person alloc] init];
//第一个参数是value,第二个参数是key(就是类的属性名称)
[per setValue:@"yayasang"forKey:@"name"];
Dog *dog = [[Dog alloc] init];
[per setValue:dog forKey:@"dog"];
//取值
NSString *name = [per valueForKey:@"name"];
NSLog(@"%@",name);
Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化。
实现的三个方法(三步骤):
//第一步:注册观察者
//涉及到的几个参数:
//Observer 观察者是谁
//KeyPath监听的属性,比如监听学生的name属性
//options :监听的内容
//NSKeyValueObservingOptionNew,
//NSKeyValueObservingOptionOld这两个参数的意思是监听它的新值和旧值
//第四个参数,上下文(直接为nil)
- (void)addObserver:(NSObject *)observerforKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)optionscontext:(nullable void *)context;
//第二步: 响应事件
-(void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullableid)object change:(nullable NSDictionary *)change context:(nullable void*)context;
//第三步:移除观察者
- (void)removeObserver:(NSObject*)observer forKeyPath:(NSString *)keyPath;
Dog.m文件中
#import "Dog.h"
@implementation Dog
- (instancetype)init
{
self = [super init];
if (self) {
//第一步:添加一个观察者
[self addObserver:self forKeyPath:@"dogHealth"options: NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil];
}
return self;
}
//第二步:响应事件(回调)
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)objectchange:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSString *object1 = change[@"new"];
if ([object1 isEqualToString:@"die"]) {
NSLog(@"狗死了,马上报警");
}
}
- (NSString *)description
{
return [NSString stringWithFormat:@"name = %@", _name];
}
- (void)dealloc
{ //第三步:移除观察者
[self removeObserver:self forKeyPath:@"dogHealth"];
[super dealloc];
}
@end
数据持久化
NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
//存数据
[userDefaults setObject:@"tom"forKey:@"name"];
//取数据
NSString *name2 = [userDefaults objectForKey:@"name"];
NSLog(@"name2 = %@",name2);
//删除数据
[userDefaults removeObjectForKey:@"name"];
//更新数据同步文件
[userDefaults synchronize];
forKeyPath
Person *person = [[Personalloc]init];
Dog *dog = [[Dog alloc]init];
person.dog = dog;
//forKeyPath路径的方法(间接给狗的名字赋值)
[person setValue:@"xixi"forKeyPath:@"dog.dogName"];
[person setValue:dog forKey:@"dog"];
- OC 07 设计模式
- OC设计模式
- OC设计模式
- OC-代理设计模式
- oc中的设计模式
- OC学习----设计模式
- OC设计模式浅析
- OC 设计模式
- OC设计模式-委托模式
- OC---protocol代理设计模式
- OC 单例设计模式
- oc单例设计模式
- OC中的代理设计模式
- oc中的工厂设计模式
- OC中代理设计模式
- OC设计模式--代理模式
- OC中的设计模式-单例模式
- oc中单例设计模式的实现
- C++模板阶段性小结
- NOIP2015普及组-扫雷游戏
- hdu5445 Food Problem(背包)
- 多线程——等待-唤醒机制
- spring3.2.0完整包下载
- OC 07 设计模式
- arm文件系统 freeing init memory没有再往下执行
- 【转】实战Nginx与PHP(FastCGI)的安装、配置与优化
- html基础
- 象棋机器人 1 引言
- runOnUiThread更新主线程
- I/O篇(4)——对象序列化
- 开车误闯红灯的补救方法 (以及由此引发的一些思考)
- 150. Insert Delete GetRandom O(1)