,,以实例讲解Objective-C中的KVO与KVC机制

,,以实例讲解Objective-C中的KVO与KVC机制

本文主要介绍一个例子来解释Objective-C中的KVO和KVC机制,即键值观察和键值编码。有需要的朋友可以参考一下。

KVO实例分析

最近遇到一个问题。在处理一个项目中的评论界面时,由于直接使用了UIWebView来显示评论列表,所以在页面的顶部和底部出现了一个CGSize为(320,65)的杂乱广告,非常显眼。头部广告因为方便把自己的logo放在头部坐标上解决了,但是尾部的,因为每个页面的评论长度不一样,坐标不一样,所以给不出死坐标。

@KVO概述:

KVO,即键值观察,提供了一种机制,当指定对象的属性被修改时,它会得到通知。

简单来说,每次修改指定观察对象的属性时,KVO都会自动通知相应的观察者。

使用步骤如下:

1.注册,指定被观察的属性、

2.实现回调方法。

3.触发回调方法

4.移除观察

代码示例:按如下方式复制代码:

-(void)viewDidLoad{

//KVO,作为观察者,每当属性‘contentSize’发生变化,都会在回调方法中通知。

[_ webview . scroll view add observer:self forkey path:@ ' contentSize ' options:nskeyvalueobservingoption new context:NULL];

}

//回调方法

-(void)observeValueForKeyPath:(ns string *)对象的关键路径:(id)对象更改:(NSDictionary *)更改上下文:(voidvoid *)上下文

{

if(object==_ webview . scroll view[key path isEqualToString:@ ' contentSize '])

{

//获取最大的Y坐标

CGSize size=_ webview . scroll view . content size;

如果(size.height 568.0) {

//屏蔽广告

_ hideboomtimage=[[UIImageView alloc]initWithFrame:CGRectMake(0,size.height-67,ScreenWidth,67)];

_ hideboomtimage . image=[ui image image named:@ ' banner '];

[_ webview . scroll view add subview:_ hideboomtimage];

[_ hideboomtimage release];

}

}

其他

{

//调用父类的方法

[super observeValueForKeyPath:对象的关键路径:对象更改:更改上下文:上下文];

}

}

-(void) dealloc {//-也可以在ARC环境下调用dealloc方法,但是不需要写[super dealloc]。

//移除KVO,否则会造成资源泄漏。

[_ webview . scroll view remove observer:self forkey path:@ ' contentSize '];

【超级dealloc】;

}

以上是针对contentSize属性,其他属性依此类推。

KVC

通常,我们使用属性的set和get方法来赋值。这里,我们引入了键值编码(KVC)来分配和评价一个类的属性。

1.基本方法(setvalue:forge key:value forge key)

复制代码如下:

//-定义学生类(。m文件没有操作)

#导入Foundation/Foundation.h

@ class HMTClass

@interface HMTStudent : NSObject{

NSString * _ name

布尔_测试;

BOOL _ isTest

布尔测试;

BOOL isTest

}

@property (nonatomic,copy)ns string * name;

@property (nonatomic,copy)ns string * sex;

@property (nonatomic,assign)n整数年龄;

@property(非原子,强)HMTClass * hmtClass

@end

//-主文件

HMTStudent * student=[[HMTStudent alloc]init];

student . HMT class=[[HMT class alloc]init];

student . name=@ ' humingtao ";//设置方法赋值

//KVC赋值

[学生setValue:@ "马尾是狗' forKey:@ ' name "];

[学生设置值:@ ' m ' for key:@ ' sex '];

[学生设置值:@(10) forKey:@ '年龄'];

//取值

NSLog(@'%s__%d__|%@ ',__FUNCTION__,__LINE__,[student valueForKey:@ ' name ']);

特别注意:

在我的类中还定义了四个BOOL值变量来验证KVC访问属性键的顺序。

【学生setValue:@(是)forKey:@ ' test "】;

结果是:_ test-_ istest-test-istest。

2.键路径访问(属性集值:ForKeyPath:用于类中属性的forKeyPath)

复制代码如下:

//创建一个类class

@interface HMTClass : NSObject

@property (nonatomic,copy)ns string * name;

@end

然后,在上面的第一点中,在Student类中编写了一个类属性hmtClass。

复制代码如下:

HMT类* HMT类=[[HMT类alloc]init];

[hmtClass设置值:@ '宇宙一班forKey:@ ' name '];

【学生setValue:HMT类forKey:@ ' HMT类'】;

ns string * HMT class name=[student valueforkey path:@ ' HMT类。名称'];

//也可以这样存值

[学生设置值:@ '宇宙一班福基路径:@ ' HMT类。名称'];

学生。HMT级。name=[student valueforkey path:@ ' HMT类。名称'];

3.自动封装基本数据类型

我们在学生类中添加分数属性n整数学号;

复制代码代码如下:

#导入foundation/基金会. h

@ class HMTClass

@interface HMTStudent : NSObject

{

NSString * _ name

n整数;

}

@end

[学生设置值:@ ' 100 '表示密钥路径:@ ' number '];

ns string * number=[student valueForKey:@ ' number '];

可见用NSString*类型设置的属性值@'100',而我们的属性是NSInteger类型的,存取都没有问题。

4.操作集合

在学生类中加入数组恩萨里,用来表示其他的学生。

复制代码代码如下:

#导入foundation/基金会. h

@ class HMTClass

@interface HMTStudent : NSObject

{

NSArray *许多学生;

}

@end

student * student 1=[[HMT student alloc]init];

学生*学生2=[[HMT student alloc]init];

student * student 3=[[HMT student alloc]init];

[student 1 setValue:@ ' 200 for key:@ ' number '];

[student 2 setValue:@ ' 300 for key:@ ' number '];

[学生3设置值:@ ' 400 '用于关键字:@ '数字'];

NSArray * array=[带对象的NSArray数组:student 1,student2,student3,nil];

[学生集值:数组forKey:@ '很多学生'];

NSLog(@'%@ ',[student valueforkey path:@ '许多学生。数字']);

打印出来是数组(200,300,400)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • ,,详解ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)
  • ,,详解JSONObject和JSONArray区别及基本用法
  • ,,实例解析Json反序列化之ObjectMapper(自定义实现反序列化方法)
  • ,,VBS中FileSystemObject对象详解(完整版)
  • ,,JSONObject使用方法详解
  • ,,django ObjectDoesNotExist 和 DoesNotExist的用法
  • ,,IOS 开发之Object-C中的对象详解
  • ,,C# ManagementObjectSearcher操作window案例详解
  • java object方法有哪些,java中object的用法
  • java object方法有哪些,java中object的用法,Java中的Object类详细介绍
  • ,,JavaScript类型系统之Object详解
  • python的object数据类型,python中object的用法
  • waitformultipleobject函数的使用,
  • object类是所有其他类型的基类,可以赋予任何类型的值,object基类方法
  • jsonobject转java对象的方法,jsonobject是什么
  • 留言与评论(共有 条评论)
       
    验证码: