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"];

0 0
原创粉丝点击