【非凡程序员】 OC第十节课 (KVO的应用二 QQ密码被盗)

走远了吗. 提交于 2019-12-09 22:25:08

这是一个QQ密码登陆地址和密码同时被修改时,通知用户QQ账号出现问题

该题难度主要在于判断监控的两次数据都是被修改的

有两种方案:

①定义一个可变的数组,把每次监控到的新旧数据添加进去,进行对比

②定义一个变量,每修改一次,该变量就自加一次,判断为2时,通知用户

 

(1)main函数
//  main.m
//  QQ被盗
//
//  Created by 非凡程序员 on 15/5/27.
//  Copyright (c) 2015年 非凡程序员. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "QQ.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
       
        Person * suiping =[[Person alloc]init];
        [suiping setValue:@"岁平" forKey:@"name"];
       
        QQ * qq=[[QQ alloc]init];
        [qq setValue:@"574829290" forKey:@"number"];
        [qq setValue:@"mimaaaaa" forKey:@"passworld"];
        [qq  setValue:@"西安" forKey:@"location"];
        //给该可变数组分配长度
        suiping.array=[NSMutableArray arrayWithCapacity:10];
        [suiping setValue:qq forKey:@"qq"];
        //注册
        [qq addObserver:suiping forKeyPath:@"passworld" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
        [qq addObserver:suiping forKeyPath:@"location" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
        //改值
        [qq setValue:@"hahhah" forKey:@"passworld"];
//      [qq setValue:@"hahhah" forKey:@"passworld"];
        [qq setValue:@"西安" forKey:@"location"];
        //移除
        [qq removeObserver:suiping forKeyPath:@"passworld"];
        [qq removeObserver:suiping forKeyPath:@"location"];
    }
    return 0;
}

 (2)Person.m 文件

//
//  Person.m
//  QQ被盗
//
//  Created by 非凡程序员 on 15/5/27.
//  Copyright (c) 2015年 非凡程序员. All rights reserved.
//

#import "Person.h"

@implementation Person

//回调

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
 
    NSString *xin=[change valueForKeyPath:NSKeyValueChangeNewKey];
    NSString *old=[change valueForKeyPath:NSKeyValueChangeOldKey];

    //给可变数组添加元素
    [_array addObject:xin];
    [_array addObject:old];

   //第一种方案  (重点)
    //判断
    if ([_array count]==4) {
        if ([_array[0] isEqualToString: _array[1]] ||  [_array[2] isEqualToString: _array[3]]) {
            NSLog(@"安全");
        }
        else
        {
            NSLog(@"危险");
        }
    }
    //第二种方案   (重点)
//    if ([xin isEqualToString: old])
//    {
//        NSLog(@"QQ安全");
//    }
//    else
//    {
//        self.error++;
//        if (self.error==2)
//        {
//            NSLog(@"有人异地(%@)修改密码,请注意",xin);
//        }
//    }
//   
   
}

@end

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!