oc 语法 kvo

点名主题 :

kvo就是一个类来监听另外一个类的变量,当变量发生改变的时候来通知这个类。

举个例子:

创建一个人的类,人的类中有一个银行卡;创建一个银行卡的类,银行卡的类中有一个钱的变量;

我们来用人的类来监听银行卡中的钱数,当银行卡中的钱数发生改变的时候来通知人;

下面我们来实现这个例子;

新建一个

创建一个person类

person.h

#import <Foundation/Foundation.h>
@class BankCard;
@interface Person : NSObject
{
    BankCard *bancard;//银行卡
}

@end

person.m

#import "Person.h"
#import "BankCard.h"
@implementation Person
//重写初始化函数
-(id) init
{
    self = [super init];
    if(self)
    {
        bancard = [[BankCard alloc]init];
        //添加一个监听 监听的变量为 bancard 中得money的变量  旧的值和新的值
        [bancard addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    }
    return self;
}
//当监听的值发生改变的时候自动调用该方法
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqual:@"money"])
    {
        NSString *new = [change objectForKey:@"old"];
        NSString *old =[change objectForKey:@"new"];
        NSLog(@"%@   %@",new,old);
    }
}

@end

银行卡类:

BankCard.h

#import <Foundation/Foundation.h>

@interface BankCard : NSObject
@property (nonatomic,assign) float money;

@end

BankCard.m

#import "BankCard.h"

@implementation BankCard
-(id)init
{
    self = [super init];
    if(self)
    {
        _money=10.0f;
        //这里用了定时器,看不懂没关系,知道意思就行,就是每隔1秒调用一下balanceUpdate这个函数来改变money的值,以便我们来观察是否监听成功;
        [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(balanceUpdate) userInfo:nil repeats:YES];

    }
    return self;
}
-(void) balanceUpdate
{
    float f = self.money;
    f += arc4random()%100;//产生一个0-99 的随机数
    self.money = f;
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...
        NSLog(@"Hello, World!");
        Person *p = [[Person alloc]init];
        [[NSRunLoop currentRunLoop]run];
    }
    return 0;
}

运行结果:

2014-07-25 21:51:32.210 IOS KVO[3388:303] Hello, World!
2014-07-25 21:51:33.214 IOS KVO[3388:303] 10   93
2014-07-25 21:51:34.213 IOS KVO[3388:303] 93   154
2014-07-25 21:51:35.214 IOS KVO[3388:303] 154   182
2014-07-25 21:51:36.213 IOS KVO[3388:303] 182   214
2014-07-25 21:51:37.213 IOS KVO[3388:303] 214   307
2014-07-25 21:51:38.213 IOS KVO[3388:303] 307   358
2014-07-25 21:51:39.213 IOS KVO[3388:303] 358   404
2014-07-25 21:51:40.213 IOS KVO[3388:303] 404   493
2014-07-25 21:51:41.213 IOS KVO[3388:303] 493   542
Program ended with exit code: -1

参考自千锋视频。

oc 语法 kvo

时间: 2024-11-08 07:15:46

oc 语法 kvo的相关文章

【OC语法快览】三、创建实例对象

Creating Objects  创建对象 There are two main ways to create an object. The first is the one you saw before: 创建对象主要有两种方法.第一种如下: NSString* myString = [NSString string]; This is the more convenient automatic style. In this case, you are creating an autorel

(转载)OC语法总结

1.定义类:@interface 类名 : 父类@end 2.使用:(冒号)表示继承一个类Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原有类结构的基础上,扩展原有类的方法(不能扩展属性),但不建议重载原有类的方法 * 开发工具默认生成的文件为:类名+Catagory名称 * Catagory可以写在单独的文件中,也可以写在原有类的文件中,如何写根据需求来决定. 4.使用<>表示实现一个Protocol(协议),如需实现多个协议,将协议名

【IOS】IOS快速入门之OC语法

Objective-C 是 C 语言的超集 您还可以访问标准 C 库例程,例如在 stdlib.h 和 stdio.h 中声明的那些例程. Objective-C 还是一种非常动态的程序设计语言,而且这种动态是其最大优势.这种动态体现在它允许在运行应用程序时(即运行时)才去确定其行为,而不是在生成期间就已固定下来.因此,Objective-C 的动态机制让程序免受约束(编译和链接程序时施加的约束):进而在用户控制下,将大多数符号解析责任转移到运行时. 当您想要在源代码中包括头文件时,请在头文件或

转:OC语法总结

1.定义类:@interface 类名 : 父类@end 2.使用:(冒号)表示继承一个类Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原有类结构的基础上,扩展原有类的方法(不能扩展属性),但不建议重载原有类的方法 * 开发工具默认生成的文件为:类名+Catagory名称 * Catagory可以写在单独的文件中,也可以写在原有类的文件中,如何写根据需求来决定. 4.使用<>表示实现一个Protocol(协议),如需实现多个协议,将协议名

OC语法——Object-C retain、copy、mutableCopy的详细分析

OC语法中的retain.copy.mutableCopy 大家都基本知道它的基本意思,但是对于mutable类型和immutable类型的处理上有很多童鞋并没有真正测试过,今天就和大家分享下: 1.先来看下immutable类型的非容器类: NSString的retain.copy和mutableCopy的测试 NSString *string = @"abc"; NSString *retainString = [string retain]; NSString *copyStri

【OC语法快览】四、基础内存管理

Basic Memory Management                                                           基础内存管理 If you're writing an application for Mac OS X, you have the option to enable garbage collection. In general, this means that you don't have to think about memory

【OC语法快览】六、类实现

Class Implementation      类实现 Let's create an implementation, starting with the getters: 接下来创建一个类实现,从访问器开始: #import "Photo.h" @implementation Photo - (NSString*) caption { return caption; } - (NSString*) photographer { return photographer; } @en

【OC语法快览】二、存取方法

Accessors 存取方法 All instance variables are private in Objective-C by default, so you should use accessors to get and set values in most cases. There are two syntaxes. This is the traditional 1.x syntax: OC中所有的实例变量默认是私有的,所以多数情况下你应该使用访问器来获得和设置实例变量的值.访问器

【OC语法快览】五、设计类接口

Designing a Class Interface     设计类接口 The Objective-C syntax for creating a class is very simple. It typically comes in two parts. 创建类的语法是很简单的,通常包括两部分. The class interface is usually stored in the ClassName.h file, and defines instance variables and