本文主要介绍一个例子来解释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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。