oc

来源:互联网 发布:修改默认ssh端口 编辑:程序博客网 时间:2024/06/07 21:48

1. 类 

首先看到类的定义的关键字是:
@interface

一般类的定义格式为:
@interface 类名:NSObject{
定义属性
}
定义方法

(返回类型方法名 : (参数类型)参数名称 

- (void)shopping:(float)price; 


  1. @implementation Car  
  2. - (void)setBrand:(NSString *)brand{  
  3.     _brand = brand;  
  4. }  
  5. - (void)setColor:(NSString *)color{  
  6.     _color = color;  
  7. }  



Person *person = [[Person alloc] init];  //初始化

点语法 在set.get 时 直接用点语法  (@proprety  直接动态setget)

  1. @property NSString *userName;  
我们使用@property定义属性之后,如果我们想修改这个属性的名称,就可以使用@synthesize关键字来对属性名称进行修改

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @synthesize userName = $userName;  

2. 继承

  1. @interface Taxi : Car{  
  2.     NSString *_company;//所属公司  
  3. }  


3. 代理(id类型+协议+多态)

3.1 多态

  1. @interface Person : NSObject{  
  2.     NSString *_name;  
  3. }  
  4.   
  5. //- (void) printWithColor:(ColorPrinter *)colorPrint;  
  6.   
  7. //- (void) printWithBlack:(BlackPrinter *)blackPrint;  
  8.   
  9. - (void) doPrint:(Printer *)printer;  
  10.   
  11. @end  

  1.   Person *person =[[Person alloc] init];  
  2.           
  3.         ColorPrinter *colorPrint = [[ColorPrinter alloc] init];  
  4.         BlackPrinter *blackPrint = [[BlackPrinter alloc] init]; 
[person doPrint:colorPrint];

3.2 协议   相当于Java中的接口(抽象类)
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @protocol WithProtocol <NSObject>  
  4.   
  5. //默认是必须实现的  
  6.   
  7. //必须实现  
  8. @required  
  9. - (void)finshTask;  
  10. - (void)dontLate;  
  11.   
  12. //可选实现  
  13. @optional  
  14. - (void)wearNeat;  
  15.   
  16. @end
这里就定义了一个协议WithProtocl

协议的定义格式:

@protocol  协议名  <父协议>


3.3 代理


  1. #import <Foundation/Foundation.h>  
  2.   
  3. @class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错  
  4.   
  5. @protocol ChildrenDelegate <NSObject>  
  6.   
  7. @required  
  8. - (void)wash:(Children *)children;  
  9. - (void)play:(Children *)children;  
  10.   
  11. @end  
  12.   
  13. @interface Children : NSObject{  
  14.       
  15.     //Nure *_nure;//保姆  
  16.     //这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型  
  17.     //但是我们还需要为这个类型添加一些方法,这里就用到了协议  
  18.     //这个代理对象必须遵从ChildrenDelegate协议  
  19.     id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象  
  20.     NSInteger timeValue;  
  21. }  
  22.   
  23. -(void)setDelegate:(id)delegate;  
  24.   
  25. @end  
这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play

我们还定义了一个很重要的属性

_delegate

这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:

只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>

然后就是一个设置协议的方法了,注意参数类型也必须是id的

  1. #import <Foundation/Foundation.h>  
  2.   
  3. #import "Children.h"  
  4.   
  5. @interface Nure : NSObject<ChildrenDelegate>  
  6.   
  7. - (void)wash:(Children *)children;  
  8. - (void)play:(Children *)children;  
  9.   
  10. @end  

测试:
  1.  Nure *nure = [[Nure alloc] init];  
  2.         Nanny *nanny= [[Nanny alloc] init];  
  3.           
  4.         [child setDelegate:nanny];  
  5. //      [child setNure:nure];  
  6.           
  7.         [[NSRunLoop currentRunLoop] run];  

Tip:


  1.   //判断wearNeat方法有没有在Student中实现了  
  2.         if([stu respondsToSelector:@selector(wearNeat)]){  
  3.             [stu wearNeat];  
  4.         } 
respondsToSelector:@selector,这个方法的作用是判断当前对象中是否定义了一个方法

4.类目 

NSString+Extension.h   给NSString类提供一个校验邮箱的方法validateEmail
  1.   
  2. #import <Foundation/Foundation.h>  
  3.   
  4. //定义类目的文件命名规则:类名+类目名称,如“NSString+Extension.h"  
  5. @interface NSString (Extension)  
  6.   
  7. - (BOOL)validateEmail;  
  8.   
  9. //覆盖NSString中的intValue方法  
  10. - (NSInteger)intValue;  
  11.   
  12. @end

5.Foundation框架中的NSObject

  1. Person *task = [[Person alloc] init];  
  2. isBelongTo = [task respondsToSelector:@selector(demo1)];  
  3. if(isBelongTo){  
  4.     [task performSelector:@selector(demo1)];  
  5.      NSLog(@"YES");  
  6. }else{  
  7.      NSLog(@"NO");  

6.NSString

  1.  //7.---------------------TypeXXXValue  
  2.         //数值转化方法  
  3.         NSString *string20 = @"3.14";  
  4.         float value = [string20 floatValue];  
  5.         string20 = @"1";  
  6.         BOOL values = [string20 boolValue];  
  7.           
  8.           
  9.         //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange  
  10.         //字符串的截取  
  11.         NSString *string21 = @"abcdefg";  
  12.         //从开始位置截取到下标为3的字串(不包括3)  
  13.         NSString *stringnews = [string21 substringToIndex:3];  
  14.         //从哪个index开始截取到尾部(包括3)  
  15.         stringnews = [string21 substringFromIndex:3];  
  16.         //截取1~(3+1)部分的字串  
  17.         NSRange range = {1,3};  
  18.         stringnews = [string21 substringWithRange:range];  
  19.           
  20.           
  21.         //9.----------------------stringByAppendingString/stringByAppendingFormat  
  22.         //字符串的追加  
  23.         NSString *string22 = @"Android";  
  24.         NSString *stringnew = [string22 stringByAppendingString:@"IOS"];  
  25.         stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];  
  26.           
  27.           
  28.         //10.---------------------rangeOfString  
  29.         //字符串的查找  
  30.         NSString *string23 = @"www.iphonetrain.com/ios.html";  
  31.         NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围  
  32.         if(rang.location == NSNotFound){  
  33.             //没找到  
  34.         }else{  
  35.             //找到了  
  36.         }  
  37.           
  38.         //11.----------------------characterAtIndex  
  39.         //取出字符串中指定的char  
  40.         NSString *string24 = @"abcdef";  
  41.         unichar c = [string24 characterAtIndex:3];

 

7.NSArray

rafd

  1. int main(int argc, const charchar * argv[]) {  
  2.     @autoreleasepool {  
  3.         //1.---------------------数组的创建  
  4.         NSString *s1 = @"zhangsan";  
  5.         NSString *s2 = @"lisi";  
  6.         NSString *s3 = @"wangwu";  
  7.         //最后的nil相当于结束的标记  
  8.         NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];  
  9.         //打印的时候会调用description方法  
  10.         //相当于:array1.description  
  11.         NSLog(@"%@",array1);  
  12.           
  13.         //使用类方法创建  
  14.         array1 = [NSArray arrayWithObjects:s1,s2,s3, nil nil];  
  15.           
  16.         //创建一个数组,将源数组中的数据拿出来放进去  
  17.         NSArray *array2 = [NSArray arrayWithArray:array1];  
  18.           
  19.           
  20.         //2.----------------------objectAtIndex  
  21.         //访问数组中的数据,数组中存放的是对象的指针  
  22.         NSString *str1 = [array1 objectAtIndex:0];  
  23.           
  24.           
  25.         //3.----------------------count  
  26.         //获取数组元素中的个数  
  27.         NSUInteger count = [array1 count];//返回的是一个无符号数值  
  28.           
  29.           
  30.         //4.----------------------containsObject  
  31.         //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值  
  32.         BOOL isContains = [array1 containsObject:@"zhangsan"];  
  33.           
  34.           
  35.         //5.----------------------indexOfObject  
  36.         //返回一个对象在数组中的下标值  
  37.         NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
  38.         if(index == NSNotFound){  
  39.             //没有找到  
  40.         }else{  
  41.             //找到了  
  42.         }  
  43.           
  44.           
  45.         //6.----------------------componentsJoinedByString  
  46.         //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接  
  47.         //注意数组中的元素必须都是字符串  
  48.         NSString *content = [array1 componentsJoinedByString:@","];  
  49.           
  50.           
  51.         //7.----------------------lastObject  
  52.         //访问数组最后一个元素  
  53.         NSString *lastObj = [array1 lastObject];  
  54.           
  55.           
  56.         //8.----------------------arrayByAddingObject  
  57.         //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的  
  58.         NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  
  59.           
  60.           
  61.         //数组的遍历  
  62.         for(int i=0;i<array1.count;i++){  
  63.             NSString *str = [array1 objectAtIndex:i];  
  64.             NSLog(@"%@",str);  
  65.         }  
  66.           
  67.         //快速遍历  
  68.         for(NSString *s in array1){  
  69.             NSLog(@"%@",s);  
  70.         }  
  71.           
  72.         //xcode4.4以后,编译器对数组的创建和访问语法做了优化  
  73.         NSArray *array7 = @[s1,s2,s3];  
  74.         NSString *s = array7[0];  
  75.           
  76.     }  
  77.     return 0;  
  78. }  


8.NSDirctionary   map 

r

  1.  //1.---------------------字典的创建  
  2.         NSArray *array1 = [NSArray arrayWithObjects:@"zhangsan",@"zhangfei", nil nil];  
  3.         NSArray *array2 = [NSArray arrayWithObjects:@"lisi",@"liping", nil nil];  
  4.           
  5.         //第一个元素:key:@"zhang" value:array1  
  6.         //第二个元素:key:@"li"  value:array2  
  7.         NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:array1,@"zhang",array2,@"li", nil nil];  
  8.         NSLog(@"%@",dict);  
  9.           
  10.         //存放一个元素  
  11.         NSDictionary *dict2 = [NSDictionary dictionaryWithObject:array1 forKey:@"zhang"];  
  12.           
  13.           
  14.         //2.---------------------获取所有的key  
  15.         NSArray *allKeys = [dict allKeys];  
  16.           
  17.           
  18.         //3.---------------------获取所有的value  
  19.         //可能为二维数组  
  20.         NSArray *allValues = [dict allValues];  
  21.           
  22.           
  23.         //4.---------------------通过key获取value  
  24.         NSArray *values = [dict objectForKey:@"zhang"];  
  25.           
  26.           
  27.         //5.---------------------优化的语法  
  28.         NSDictionary *dict3 = @{@"zhangsan":array1,@"lisi":array2};  
  29.         NSLog(@"%@",dict3);  
  30.           
  31.         NSArray *array4 = dict3[@"zhang"];  
  32.           
  33.           

二、NSMutableDirctionary类

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  main.m  
  3. //  20_NSMutableDictionary  
  4. //  
  5. //  Created by jiangwei on 14-10-12.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. //可变字典  
  12. int main(int argc, const charchar * argv[]) {  
  13.     @autoreleasepool {  
  14.         //1.-------------创建一个可变字典,大小为3  
  15.         NSMutableDictionary *md1 = [[NSMutableDictionary alloc] initWithCapacity:3];  
  16.         NSArray *array1 = [[NSArray alloc] initWithObjects:@"zhangsan",@"lis", nil nil];  
  17.           
  18.           
  19.         //2.-------------添加元素  
  20.         [md1 setObject:array1 forKey:@"zhang"];  
  21.           
  22.         NSMutableDictionary *md2 = [[NSMutableDictionary alloc] initWithCapacity:3];  
  23.         [md2 addEntriesFromDictionary:md1];  
  24.           
  25.           
  26.         //3.-------------删除元素  
  27.         [md1 removeObjectForKey:@"zhang"];//以key删除  
  28.         [md1 removeAllObjects];//删除所有元素  
  29.         [md1 removeObjectsForKeys:array1];//以value删除  
  30.           
  31.           
  32.         //4.-------------循环遍历字典  
  33.         //快速遍历  
  34.         for (NSString *key in md1) {  
  35.             NSArray *values = [md1 objectForKey:key];  
  36.             for(NSString *v in values){  
  37.                 NSLog(@"%@",v);  
  38.             }  
  39.         }  
  40.           
  41.         //普通遍历  
  42.         NSArray *allKey = [md1 allKeys];  
  43.         for(int i=0;i<allKey.count;i++){  
  44.             NSArray *value = [md1 objectForKey:allKey[i]];  
  45.         }  
  46.           
  47.           
  48.         //字典是无序的  
  49.           
  50.           
  51.     }  
  52.     return 0;  
  53. }  

9.KVC  KVO

fdgsdfgs

  1. //设置值  
  2.         //这里setValue方法:第一个参数是value,第二个参数是key(就是类的属性名称)  
  3.         [p setValue:@"jiangwei" forKey:@"name"];  
  4.           
  5.         Dog *dog = [[Dog alloc] init];  
  6.         [p setValue:dog forKey:@"dog"];  
  7.           
  8.         //KVC设置值时,如果属性有set方法,则优先调用set方法,如果没有则直接设置上去,get方法类似  
  9.           
  10.         //读取值  
  11.         NSString *name = [p valueForKey:@"name"];  
  12.           
  13.         //设置基本数据类型  
  14.         //这里需要将基本类型转化成NSNumber  
  15.         //在设置值的时候,会有自动解包的过程,NSNumber会解包赋值给age  
  16.         [p setValue:@22 forKey:@"age"]; 

下面再来看一下KVC中强大的功能:键值路径

键值路径是对于一个类中有数组对象的属性进行便捷操作。

a

  1. //--------------------KVC的运算  
  2. Author *author = [[Author alloc] init];  
  3. [author setValue:@"莫言" forKeyPath:@"name"];  
  4.   
  5. Book *book1 = [[Book alloc] init];  
  6. book1.name = @"红高粱";  
  7. book1.price = 9;  
  8. Book *book2 = [[Book alloc] init];  
  9. book2.name = @"蛙";  
  10. book2.price = 10;  
  11. NSArray *array = [NSArray arrayWithObjects:book1,book2, nil nil];  
  12. [author setValue:array forKeyPath:@"issueBook"];  

2、下面就开始用到KVC中键值路径了

1)获取作者类中书籍数组中所有书籍的价格

2、下面就开始用到KVC中键值路径了

1)获取作者类中书籍数组中所有书籍的价格

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //基本数据类型会自动被包装成NSNumber,装到数组中  
  2. //得到所有书籍的价格  
  3. NSArray *priceArray = [author valueForKeyPath:@"issueBook.price"];  
  4. NSLog(@"%@",priceArray);  
看到了:@"issueBook.price" 这就是键值路径的使用,issueBook是作者类中的书籍数组属性名,price是书籍类的属性,中间用点号进行连接,这样我们就可以获取到了所有书籍的价格了

  1. //获取数组的大小  
  2. NSNumber *count = [author valueForKeyPath:@"issueBook.@count"];  
  3. NSLog(@"count=%@",count); 
  1. //获取书籍价格的总和  
  2. NSNumber *sum = [author valueForKeyPath:@"issueBook.@sum.price"];  
  3. NSLog(@"%@",sum); 
  1. //获取书籍的平均值  
  2. NSNumber *avg = [author valueForKeyPath:@"issueBook.@avg.price"];  
  3. NSLog(@"%@",avg);  
  4.   
  5. //获取书籍的价格最大值和最小值  
  6. NSNumber *max = [author valueForKeyPath:@"issueBook.@max.price"];  
  7. NSNumber *min = [author valueForKeyPath:@"issueBook.@min.price"]

二、KVO操作

KVO操作在OC中也是经常会用到的,而且这种机制在java中不存在的。

它的作用就是用来监听类中属性值的变化,实现原理是观察者模式,当然我们也可以使用观察者模式在Java中实现这样的机制

看一下具体的例子:现在有一个小孩类,他有两个属性:开心值,饥饿值,然后还有一个护士类,用来监听孩子类的这两个属性值的

Chidren.h

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Children.h  
  3. //  44_KVO  
  4. //  
  5. //  Created by jiangwei on 14-10-16.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @interface Children : NSObject  
  12.   
  13. @property NSInteger *hapyValue;  
  14. @property NSInteger *hurryValue;  
  15.   
  16.   
  17. @end  

Children.m

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Children.m  
  3. //  44_KVO  
  4. //  
  5. //  Created by jiangwei on 14-10-16.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Children.h"  
  10.   
  11. @implementation Children  
  12.   
  13. - (id) init{  
  14.     self = [super init];  
  15.     if(self != nil){  
  16.         //启动定时器  
  17.         [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];  
  18.         self.hapyValue100;  
  19.     }  
  20.     return self;  
  21. }  
  22.   
  23. - (void) timerAction:(NSTimer *) timer{  
  24.     //使用set方法修改属性值,才能触发KVO  
  25.       
  26.     int value = _hapyValue;  
  27.     [self setHapyValue:--value];  
  28.       
  29.     int values = _hurryValue;  
  30.     [self setHurryValue:--values];  
  31. }  
  32.   
  33.   
  34. @end  
在初始化方法中,我们启动一个定时器,然后隔1s就去修改孩子类的值


Nure.h

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Nure.h  
  3. //  44_KVO  
  4. //  
  5. //  Created by jiangwei on 14-10-16.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @class Children;  
  12. @interface Nure : NSObject{  
  13.     Children *_children;  
  14. }  
  15.   
  16. - (id) initWithChildren:(Children *)children;  
  17.   
  18. @end  
定义一个孩子属性

Nure.m

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //  
  2. //  Nure.m  
  3. //  44_KVO  
  4. //  
  5. //  Created by jiangwei on 14-10-16.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Nure.h"  
  10. #import "Children.h"  
  11.   
  12. @implementation Nure  
  13.   
  14. - (id) initWithChildren:(Children *)children{  
  15.     self = [super init];  
  16.     if(self != nil){  
  17.         _children = children;  
  18.           
  19.         //观察小孩的hapyValue  
  20.         //使用KVO为_children对象添加一个观察者,用于观察监听hapyValue属性值是否被修改  
  21.         [_children addObserver:self forKeyPath:@"hapyValue" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"context"];  
  22.           
  23.         //观察小孩的hurryValue  
  24.         [_children addObserver:self forKeyPath:@"hurryValue" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"context"];  
  25.     }  
  26.     return self;  
  27. }  
  28.   
  29. //触发方法  
  30. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context{  
  31.     NSLog(@"%@",change);  
  32.     //通过打印change,我们可以看到对应的key  
  33.       
  34.     //通过keyPath来判断不同属性的观察者  
  35.     if([keyPath isEqualToString:@"hapyValue"]){  
  36.         //这里change中有old和new的值是因为我们在调用addObserver方法时,用到了  
  37.         //NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;想要哪一个就用哪一个  
  38.         //[change objectForKey:@"old"]是修改前的值  
  39.         NSNumber *hapyValue = [change objectForKey:@"new"];//修改之后的最新值  
  40.           
  41.         NSInteger *value = [hapyValue integerValue];  
  42.           
  43.         if(value < 90){  
  44.             //do something...  
  45.         }  
  46.     }else if([keyPath isEqualToString:@"hurryValue"]){  
  47.         //这里change中有old和new的值是因为我们在调用addObserver方法时,用到了  
  48.         //NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;想要哪一个就用哪一个  
  49.         //[change objectForKey:@"old"]是修改前的值  
  50.         NSNumber *hurryValue = [change objectForKey:@"new"];//修改之后的最新值  
  51.           
  52.         NSInteger *value = [hurryValue integerValue];  
  53.           
  54.         if(value < 90){  
  55.             //do something...  
  56.         }  
  57.     }  
  58.       
  59.     NSLog(@"%@",context);//打印的就是addObserver方法的context参数  
  60.       
  61.       
  62.       
  63.     //使用KVC去修改属性的值,也会触发事件  
  64. }  
  65.   
  66. - (void)dealloc{  
  67.       
  68.     //移除观察者  
  69.     [_children removeObserver:self forKeyPath:@"hapyValue"];  
  70.     [_children removeObserver:self forKeyPath:@"hurryValue"];  
  71.       
  72. }  
  73.   
  74. @end  
看到了在这里就开始进行监听操作了


下面来具体看一下如何做到监听的

1、添加监听对象

我们使用addObserver方法给孩子添加监听对象

第一个参数:监听者,这里是Nure,所以可以直接传递self

第二个参数:监听对象的属性名

第三个参数:监听这个属性的状态:这里可以使用|进行多种组合操作,属性的新值和旧值

第四个参数:传递内容给监听方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //观察小孩的hapyValue  
  2. //使用KVO为_children对象添加一个观察者,用于观察监听hapyValue属性值是否被修改  
  3. [_children addObserver:self forKeyPath:@"hapyValue" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"context"];  
  4.   
  5. //观察小孩的hurryValue  
  6. [_children addObserver:self forKeyPath:@"hurryValue" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"context"];  

2、监听方法

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //触发方法  
  2. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context{  
  3.     NSLog(@"%@",change);  
  4.     //通过打印change,我们可以看到对应的key  
  5.       
  6.     //通过keyPath来判断不同属性的观察者  
  7.     if([keyPath isEqualToString:@"hapyValue"]){  
  8.         //这里change中有old和new的值是因为我们在调用addObserver方法时,用到了  
  9.         //NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;想要哪一个就用哪一个  
  10.         //[change objectForKey:@"old"]是修改前的值  
  11.         NSNumber *hapyValue = [change objectForKey:@"new"];//修改之后的最新值  
  12.           
  13.         NSInteger *value = [hapyValue integerValue];  
  14.           
  15.         if(value < 90){  
  16.             //do something...  
  17.         }  
  18.     }else if([keyPath isEqualToString:@"hurryValue"]){  
  19.         //这里change中有old和new的值是因为我们在调用addObserver方法时,用到了  
  20.         //NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;想要哪一个就用哪一个  
  21.         //[change objectForKey:@"old"]是修改前的值  
  22.         NSNumber *hurryValue = [change objectForKey:@"new"];//修改之后的最新值  
  23.           
  24.         NSInteger *value = [hurryValue integerValue];  
  25.           
  26.         if(value < 90){  
  27.             //do something...  
  28.         }  
  29.     }  
  30.       
  31.     NSLog(@"%@",context);//打印的就是addObserver方法的context参数  
  32.       
  33.       
  34.       
  35.     //使用KVC去修改属性的值,也会触发事件  
  36. }  
我们上面传递的第一个参数是监听者,这个方法也是在监听者中实现的,当属性值发生变化的时候,这个方法会被回调

这个方法的参数:

第一个参数:键值路径

第二个参数:监听对象

第三个参数:变化的值

第四个参数:传递的内容

我们看到代码中有一个特殊的参数:第三个参数:NSDirctionary类型的

其实我们如果不知道是干什么的,我们可以打印一下他的结果看一下,很简单,这里就不截图说明了

我们会发现他有两个键值对

key是:new和old

他们就是分别代表这个属性值变化的前后值,同时他们的得到也和之前我们添加监听对象时设置的第三个参数有关:

NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld

那个地方设置了几种状态,这里的NSDirctionary中就会有几个键值对


3、销毁方法

这个并不属于KVO的内容了,只是在这里用到了就顺便说一下

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (void)dealloc{  
  2.       
  3.     //移除观察者  
  4.     [_children removeObserver:self forKeyPath:@"hapyValue"];  
  5.     [_children removeObserver:self forKeyPath:@"hurryValue"];  
  6.       
  7. }  
我们在创建一个对象的时候会调用alloc方法,当对象被销毁的时候会调用dealloc这个方法,这个和C++中的析构函数一样,Java中有垃圾回收器,所以没有此类的方法,但是有一个finalize方法,其实这个方法就是在垃圾回收器回收对象的时候会调用,和这个功能差不多,但是在Java中,我们并不提倡使用这个方法。因为会造成GC的回收发生错误。

我们在销毁方法中需要移除监听者


总结

这一篇就介绍了OC中比较有特色的两个机制:KVC和KVO

KVC:就是可以暴力的去get/set类的私有属性,同时还有强大的键值路径对数组类型的属性进行操作

KVO:监听类中属性值变化的

=============================================================================


文件读取  :   

归档和解档    http://blog.csdn.net/jiangwei0910410003/article/details/41872551

文件操作 http://blog.csdn.net/jiangwei0910410003/article/details/41875015    

ios 还有自己的方法  http://blog.csdn.net/jiangwei0910410003/article/details/53000565

http://blog.csdn.net/w1396037340/article/details/41956413


http://blog.csdn.net/u012890196/article/details/17074527


http://blog.csdn.net/u012890196/article/details/17229121
0 0
原创粉丝点击