kvo

NSNotificationCenter消息通信(KVO)

笑着哭i 提交于 2020-03-30 03:32:39
NSNotificationCenter 是程序不同类间的消息通信. 注册 消息 通知: 1 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(mthMsg:) name:@"mthMsg" object:nil]; addObserver:  注册通知 selector: 收到通知后调用何种方法; name: 通知的名字(唯一标示)。 发送消息通知 : [[NSNotificationCenter defaultCenter] postNotificationName:@"mthMsg" object:obj]; postNotificationName:消息的名称 //键盘注册通知1 //键盘升起 2 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 3 //键盘降下 4 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)

iOS开发之KVC/KVO区别使用

强颜欢笑 提交于 2020-03-06 10:34:50
一,概述 KVO, 即: Key-Value Observing ,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单。 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。 1.定义DataModel, [cpp] view plain copy @interface StockData : NSObject { NSString * stockName; float price; } @end @implementation StockData @end 2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边 [cpp] view plain copy - ( void )viewDidLoad { [super viewDidLoad]; stockForKVO = [[StockData alloc] init]; [stockForKVO setValue:@ "searph" forKey:@ "stockName" ];

KVC和KVO学习笔记

怎甘沉沦 提交于 2020-02-26 23:09:46
在编程中,最常见的就是程序的流程取决于你所使用的各种变量和属性的值,根据变量和属性的值确定后面运行的代码,有时会检查对象是否已加入数组,或是否已被移除,因此,获取类中属性的变化是编程中重要部分。 我们有多种方式获取对象的改变,如 委托、通知 等。如果需要观察多个属性的变化,为避免产生大量的代码,最好是使用键值观察(Key Value Observing,简称KVO),这也是Apple在自己的软件中大量使用的一种。 使用键值观察跟踪单个属性或集合(如数组)的变化非常高效,它只需要在观察者方法中添加代码,不需要修改被观察文件内的代码,这一点和委托、通知不同。但需要注意的是,键值观察(KVO)是建立在键值编码(Key Value Coding,简称KVC)的基础上,也就是说任何你想使用KVO观察的属性必须符合键值编码。 KVC和KVO提供了一个强大高效的方式来编写代码,学习KVO前必须先掌握KVC,所以下面我们结合demo来学习KVC。在这个demo中所有结果将直接在控制台输出,没有创建用户界面。 1. 创建应用 启动Xcode,点击File > New > Project…,选择iOS > Application > Single View Application模板,点击 Next ;在 Product Name 一栏填写 KVC&KVODemo ,点击 Next ;选择文件位置

ios面试题目(一)

只愿长相守 提交于 2020-02-12 02:23:40
1.多线程在实际现实中有哪些应用?(网络操作和大量图片处理不算) 通常耗时的操作都会放在子线程里处理,然后再回到主线程来显示。下面举几个例子: 我们要从数据库提取数据还要将数据分组后显示,那么就会开个子线程来处理,处理完成后才去刷新UI显示。 拍照后,会在子线程处理图片,完成后才回到主线程来显示图片。拍照出来的图片太大了,因此要做处理。 音频、视频处理会在子线程来操作 文件较大时,文件操作会在子线程中处理 做客户端与服务端数据同步时,会在后台闲时自动同步 2、如果app比较大,怎么样减少app的大小? 参考答案: 将build setting中的Optimization Level设置为Fastest, Smallest [-Os],在发布模式下,默认就是这样设置的 将build setting 中的Strip Debug Symbols During Copy设置为YES,在发布模式下,默认就是这样设置的 资源文件查找出所有未使用的,去掉这些永远不会使用的资源文件 对嵌入App的音频进行压缩处理 3、你在迭代开发中是怎么处理版本兼容问题? 参考答案: 版本迭代一定要注意兼容老版本,比如新增了字段或者去掉了某些不再使用的字段,不能引起应用闪退。我们这里只谈程序代码兼容新老版本问题,不考虑业务。因为业务是要求后台来兼容的,通常接口会有版本号控制,用于兼容不同版本的客户端。

iOS面试知识点

旧时模样 提交于 2020-02-12 01:19:36
1 iOS基础 1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,那么就是有两个指针指向同一个对象,这个对象销毁后两个指针都应该置空。深拷贝是对一个对象进行拷贝,相当于对对象进行复制,产生一个新的对象,那么就有两个指针分别指向两个对象。当一个对象改变或者被销毁后拷贝出来的新的对象不受影响。 实现深拷贝需要实现NSCoying协议,实现- (id)copyWithZone:(NSZone *)zone 方法。当对一个property属性含有copy修饰符的时候,在进行赋值操作的时候实际上就是调用这个方法。 父类实现深拷贝之后,子类只要重写copyWithZone方法,在方法内部调用父类的copyWithZone方法,之后实现自己的属性的处理 父类没有实现深拷贝,子类除了需要对自己的属性进行处理,还要对父类的属性进行处理。 1.2 KVO,NSNotification,delegate及block区别 KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者。 NSNotification是通知

iOS开发 - 分享一个关于KVO的扩展

让人想犯罪 __ 提交于 2020-02-06 17:02:41
123456789101112131415161718192021222324252627282930313233343536 typealias KVONotificationBlock = (Any?, _ oldValue: Any?, _ value: Any?) -> Voidextension NSObject { //默认的函数,option的初始值是Initial|New, 监测打变化的值默认转到主线程 func observe(_ object: Any?, keyPath: String, block: @escaping KVONotificationBlock) { self.kvoController.observe(object, keyPath: keyPath, options:[.initial, .new], block:{(observer: Any?, object: Any, change: [String: Any]) in DispatchQueue.main.async(execute: { () -> Void in block(observer, change["old"], change["new"]); }) }) } func observe(_ object: Any?, keyPath: String, options:

KVO

浪尽此生 提交于 2020-02-02 17:32:46
通知和代理: 通知:一对多(随处可发通知,随处可以接收通知) 优点:发送者和接受者都不需要知道对方是谁 缺点:发送方没有办法接受到反馈值 代理:一对一(一触发通知,即刻接收) 优点:支持的类有详尽的信息 缺点:必须支持委托 KVO 概述 Key-Value Observing,键值观察,观察者模式的衍生 对目标对象的某属性添加观察,当属性发生变化时,通过触发观察者对象实现的接口方法,自动通知观察者 较完美的将目标对象和观察者对象进行解耦 KVO的定义是对NSObject的扩展所实现,所以, 继承自NSObject的类 ,都能使用KVO 过程 注册观察者 监听回调 移出监听 注册 - ( void ) addObserver : ( NSObject * ) observer forKeyPath : ( NSString * ) keyPath options : ( NSKeyValueObservingOptions ) options context : ( nullable void * ) context ; observer:观察者 keyPath:所观察的属性 options:属性配置 context:上下文 options NSKeyValueObservingOptionNew:change字典包括改变后的值

案例分析:设计模式与代码的结构特性

折月煮酒 提交于 2020-01-10 19:34:05
一、Cocoa设计模式   Cocoa环境的许多架构和机制都能够有效地使用设计模式:抽象设计可以解决特定环境中的重复问题。 本文描述了Cocoa中设计模式的主要实现,主要关注模型(Model) - 视图(View) - 控制器(Controller)和对象建模。 本章的主要目的是让您更深入地了解Cocoa的设计模式,并鼓励您在自己的软件项目中利用这些模式。 二、什么是设计模式?      设计模式是设计的模板,它可以在特定的上下文中解决一般的、重复出现的问题。它是一种抽象工具,在建筑、工程和软件开发等领域都很有用。下面的部分总结了设计模式是什么,解释了为什么它们对于面向对象设计很重要,并讨论了一个示例设计模式。 三、Cocoa如何改变设计模式      可以在OS X和iOS版本中找到适用于Cocoa的设计模式。 基于模式的机制和体系结构在Cocoa框架和Objective-C 的 runtime 和语言中很常见。Cocoa经常把自己独特的旋律放在一个模式上,因为它的设计受语言能力或现有体系结构等因素的影响。   本节包含大多数设计模式的摘要,这些设计模式是在“ 设计模式:可重用面向对象软件的元素”中编目的。 每个部分不仅总结了模式,还讨论了Cocoa的实现。 只列出Cocoa实现的模式,以下各节中的模式描述都与特定的Cocoa上下文有关。Cocoa设计模式的实现有多种形式。

iOS中KVC与KVO的应用解析

末鹿安然 提交于 2020-01-07 14:09:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> iOS中KVC与KVO的应用解析 一、 NSKeyValueCoding(KVC) 1、从一个小例子引入 KVC键值编码是Object-C为我们提供的一种对成员变量赋值的方法。在探讨其方法之前,我们先来看一个小例子: 首先,创建一个数据模型 model类: //.h文件 #import <Foundation/Foundation.h> @interface Model : NSObject { @public//将成员变量设置为公有的 以便其他文件有访问权限 NSString * str; } @end 我们在其他文件中有两种方法str进行赋值和取值: Model * model = [[Model alloc]init]; model->str=@"312";//普通方法赋值 [model setValue:@"321" forKey:@"str"];//kvc赋值 NSLog(@"%@",model->str);//普通方法取值 NSLog(@"%@",[model valueForKey:@"str"]);//kvc取值 同样的,对于用@property声明的变量,使用kvc的效果和使用点语法,setter,getter方法的效果是一样的。 2、KVC有关函数方法详解 通过上面的例子

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

有些话、适合烂在心里 提交于 2020-01-07 13:13:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> iOS 中KVC、KVO、NSNotification、delegate 总结及区别 1、KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。 Demo: @interface myPerson : NSObject { NSString*_name; int _age; int _height; int _weight; } @end @interface testViewController :UIViewController @property (nonatomic, retain) myPerson*testPerson; @end - (void)testKVC { testPerson = [[myPerson alloc] init]; NSLog(@"testPerson‘s init height =%@", [testPerson valueForKey:@"height"]); [testPerson setValue:[NSNumber numberWithInt:168]forKey:@"height"]; NSLog(@