首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏程序员充电站(itcharge)

    iOS 开发:『Crash 防护系统』(二)KVO 防护

    添加或者移除时 keypath == nil,导致崩溃。 ---- 2. keyPath || ([keyPath isKindOfClass:[NSString class]] && keyPath.length <= 0)) { keyPath || ([keyPath isKindOfClass:[NSString class]] && keyPath.length <= 0)) { keyPath || ([keyPath isKindOfClass:[NSString class]] && keyPath.length <= 0)) { 添加或者移除时 keypath == nil,导致崩溃。

    5.1K41发布于 2020-10-26
  • 来自专栏技术总结

    FBKVOController源码剖析与学习

    = keyPath.length && NULL ! = block, @"missing required parameters observe:%@ keyPath:%@ block:%p", object, keyPath, block); if info _FBKVOInfo *info = [[_FBKVOInfo alloc] initWithController:self keyPath:keyPath options:options *keyPath in keyPaths) { [self observe:object keyPath:keyPath options:options block:block]; } } 观察已经观察到的对象keyPath或nil的结果是没有操作的。

    1.1K40发布于 2018-09-30
  • 来自专栏鸿蒙开发笔记

    OpenHarmony 移植案例与原理 - utils子系统之KV存储部件 (2)

    (resolvedPath, len, keyPath, strlen(keyPath)) == EOK) { free(keyPath); return EC_SUCCESS (keyPath); return EC_FAILURE; }⑷ int fd = open(keyPath, O_RDONLY, S_IRUSR); free(keyPath (access(keyPath, F_OK) == F_OK) { free(keyPath); return FALSE; } free(keyPath); (keyPath); return EC_FAILURE; }⑷ int fd = open(keyPath, O_RDONLY, S_IRUSR); free(keyPath (access(keyPath, F_OK) == F_OK) { free(keyPath); return FALSE; } free(keyPath);

    25010编辑于 2025-06-14
  • 来自专栏iOS开发干货分享

    探究ReactiveCocoa 底层KVO封装流程

    options:(NSKeyValueObservingOptionNew) context:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath 二、深入RAC底层逐层探究KVO实现 * * * 点击RACObserver找到这个宏 #define _RACObserve(TARGET, KEYPATH) \ ({ \ __weak id target_ = (TARGET); \ [target_ rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) observer:self]; \ = 0) { id initialValue = [self valueForKeyPath:keyPath]; NSDictionary *initialChange (keyPath !

    50820发布于 2019-06-10
  • 来自专栏程序员——iOS开发

    详解:RxSwift-KVO底层探索(上)

    : __owned KeyPath<Self, Value>) { (self as! changeKind: NSKeyValueChange, valuesAt indexes: IndexSet, for keyPath: __owned KeyPath<Self, Value>) func willChangeValue<Value>(for keyPath: __owned KeyPath<Self, Value>, withSetMutation mutation: NSKeyValueSetMutationKind set) } public func didChangeValue<Value>(for keyPath: __owned KeyPath<Self, Value>) { (self as! : NSKeyValueChange, valuesAt indexes: IndexSet, for keyPath: __owned KeyPath<Self, Value>) { (self

    94520发布于 2019-08-09
  • 来自专栏韦弦的偶尔分享

    Swift 中 key paths 的能力

    其中的一个特性就是KeyPath。这周,就让我们来看看KeyPath是如何在Swift中工作的,并且有哪些非常酷非常有用的事情可以让我们去做。 func map<T>(_ keyPath: KeyPath<Element, T>) -> [T] { return map { $0[keyPath: keyPath] } : KeyPath<Element, T>) -> [Element] { return sorted { a, b in return a[keyPath: keyPath ] < b[keyPath: keyPath] } } } 使用上面的扩展,我们现在能够快速且轻松地对任何序列进行排序,只需给出我们想要排序的key paths。 <Model, String> let subtitleKeyPath: KeyPath<Model, String> let imageKeyPath: KeyPath<Model,

    2.9K20发布于 2021-07-08
  • 来自专栏我只不过是出来写写iOS

    RAC(ReactiveCocoa)介绍(八)——KVO销毁

    NSLog(@"%@",x); }]; 宏定义RACObserve方法实现中,可以发现- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath :@keypath(TARGET, KEYPATH) observer:self]; \ }) 进入- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath :(__weak NSObject *)observer { return [[[self rac_valuesAndChangesForKeyPath:keyPath options RACKVOTrampoline类初始化 进入到该方法中,会发现该方法将keyPath、block、target、strongTarget、observer属性保存至成员变量中。 (keyPath !

    1.6K20发布于 2019-04-02
  • 来自专栏iOS小生活

    KVO详解(二)

    然后在分类中去增加一个自定义的添加观察者的方法,在该方法中,大致是做三件事情: 验证观察的keyPath是否有对应的setter方法,有的话才会进行下一步 创建一个中间类 修改实例对象的isa指针的指向 答案是,在添加KVO观察者的时候,会将本次观察的keyPath、观察的类型options、观察者等信息都封装进一个信息Model中,然后将这个Model存进一个数组里面: ? ? :keyPath options:options]; } - (void)norman_observeValueForKeyPath:(NSString *)keyPath ofObject:(id) for (NormanKVOInfo *info in observerArr) { if ([info.keyPath isEqualToString:keyPath]) { for (NormanKVOInfo *info in observerArr) { if ([info.keyPath isEqualToString:keyPath]) {

    93431发布于 2021-03-25
  • 来自专栏HelloCode开发者学习平台

    RxSwift-KVO底层探索(下)

    forKeyPath: "name", options: .new, context: nil) // 2: 观察响应回调 override func observeValue(forKeyPath keyPath 实现KVOObservableProtocol协议, 拓展几个协议属性,常规面向协议编程的思路 init(object: AnyObject, keyPath: String , options: KeyValueObservingOptions, retainTarget: Bool) { self.target = object self.keyPath = keyPath self.options = options self.retainTarget = retainTarget if retainTarget { :self.keyPath options:options context:nil]; return self; } 这里面针对外界的一些KVO信息处理保存: callback回调的保存

    65520编辑于 2023-03-23
  • 来自专栏韦弦的偶尔分享

    使用 key paths 创建自定义查询函数

    <T>(keyPath: KeyPath<T, Bool>) -> (T) -> Bool { return { ! $0[keyPath: keyPath] } } 以上基本上就是是重载内置的 ! =<T, V: Equatable>(lhs: KeyPath<T, V>, rhs: V) -> (T) -> Bool { return { $0[keyPath: lhs] ! >(lhs: KeyPath<T, V>, rhs: V) -> (T) -> Bool { return { $0[keyPath: lhs] >= rhs } } // 用于扩展类似 .filter (\.age < 100) func <<T, V: Comparable>(lhs: KeyPath<T, V>, rhs: V) -> (T) -> Bool { return { $0[keyPath

    1.8K10发布于 2021-07-01
  • 来自专栏wOw的Android小站

    [Objective-C] KVC 和 KVO

    (NSMutableSet *)mutableSetValueForKey:(NSString *)key; - (nullable id)valueForKeyPath:(NSString *)keyPath ; - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; - (BOOL)validateValue:(inout id ; - (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath NS_AVAILABLE(10_7, 5_ 0); - (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath; - (nullable id)valueForUndefinedKey 对于当前类的直接成员变量,把变量名作为key来访问,否则要写成keyPath来访问。

    91510发布于 2018-09-18
  • 来自专栏Swift-开源分析

    Swift5.8 中 AnyKeyPath 支持 CustomDebugStringConvertible 协议

    如果对print()或者po命令传递 keypath(key路径,下文均使用原 keypath 表述),会输出 Swift 类的标准信息。 foregroundColor: UIColor var overlay: UIColor { backgroundColor.withAlphaComponent(0.8) }}再添加 keypath 设计细节实现 CustomDebugStringConvertible 协议跟目前在KeyPath.swift中实现的函数_project非常相似,该函数将循环使用 keypath 的每个缓存区,按下列方式来处理每个段 所以此时打印 keypath 函数,则会输出:print(\Theme.backgroundColor) // outputs "\Theme. 总结Swift 5.8 源代码中为AnyKeyPath实现CustomDebugStringConvertible,支持 keypath 输出更详细的类型数据。

    84530编辑于 2022-11-10
  • 来自专栏Swift社区

    Swift 中 key paths 的能力

    其中的一个特性就是 KeyPath。这周,就让我们来看看 KeyPath 是如何在 Swift 中工作的,并且有哪些非常酷非常有用的事情可以让我们去做。 Key paths 有三种主要变种: KeyPath:提供对属性的只读访问权限。 func map<T>(_ keyPath: KeyPath<Element, T>) -> [T] { return map { $0[keyPath: keyPath] } : KeyPath<Element, T>) -> [Element] { return sorted { a, b in return a[keyPath: keyPath ] < b[keyPath: keyPath] } } } 使用上面的扩展,我们现在能够快速且轻松地对任何序列进行排序,只需给出我们想要排序的 key paths。

    2K10发布于 2021-11-26
  • 来自专栏Eureka的技术时光轴

    Programmatically PIN Shortcut onto Taskbar on Win7/win10 快捷方式固定到任务栏

    = "HKCU:\SOFTWARE\Classes" $KeyPath2 = "*" $KeyPath3 = "shell" $KeyPath4 = "{:}" $ValueName = "ExplorerCommandHandler " + "Explorer\CommandStore\shell\Windows.taskbarpin")).ExplorerCommandHandler $Key2 = (Get-Item $KeyPath1 ).OpenSubKey($KeyPath2, $true) $Key3 = $Key2.CreateSubKey($KeyPath3, $true) $Key4 = $Key3.CreateSubKey ($KeyPath4, $true) $Key4.SetValue($ValueName, $ValueData) $Shell = New-Object -ComObject "Shell.Application ) if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) { $Key2.DeleteSubKey($KeyPath3) } https

    1.2K20发布于 2019-09-29
  • 来自专栏iOS开发干货分享

    探究ReactiveCocoa 底层KVO封装流程

    ) \({ \ __weak id target_ = (TARGET); \ [target_ rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) = [keyPath copy]; NSRecursiveLock *objectLock = [[NSRecursiveLock alloc] init]; objectLock.name = 0) { id initialValue = [self valueForKeyPath:keyPath]; NSDictionary *initialChange = (keyPath ! = (__bridge void *)self) { [super observeValueForKeyPath:keyPath ofObject:object change:change

    94320发布于 2019-06-18
  • 来自专栏代码手工艺人

    轻量级KVO[译]

    我会实现一个自己用的简单KVO类,我认为KVO非常棒,然而对于我大部分的使用场景来说,有这两个问题: 我不喜欢在observeValueForKeyPath:ofObject:change:context:方法里通过keyPath :(NSString*)keyPath target:(id)target selector: - (id)initWithObject:(id)object keyPath:(NSString*)keyPath target:(id)target selector:(SEL)selector { = keyPath; [object addObserver:self forKeyPath:keyPath options:0 context:self]; } return self ; } 一旦被观察者发生变化,我们就通知观察者(target),如果它还存在的话: - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:

    68630发布于 2021-09-07
  • 来自专栏非典型技术宅

    iOS动画系列之五:基础动画之缩放篇&旋转篇Swift+OC1. 思路和最终成果2. 抽取公共方法3. 懒加载Layer4. 添加动画

    关于keyPath的字段有啥作用,可以看看第三篇:iOS动画系列之三:Core Animation。介绍了Core Animation的常用属性和方法。 4.3 animationWithKeyPath中,常用的keyPath 这个里面有详细的说明。 代码如下: //创建基础Animation fileprivate func createAnimation (keyPath: String, toValue: CGFloat) -> = keyPath //设置动画的起始位置。 : 0.5), forKey: nil) 4.2 添加旋转动画 // 添加旋转的动画 redRotationLayer.add(createAnimation(keyPath

    3.5K10发布于 2018-06-28
  • 来自专栏全栈程序员必看

    indexedDB_INDEX函数

    每次都存入一个对象 该对象有一个属性路径必须是keyPath 如果对象不存在对应的keyPath,会报错 非对象型仓库 专门用来存储非对象数据 不需要传keyPath 混合仓库 存放混合类型的数据 会发生对象污染——当你存入一个对象时,如果该对象中并没有对应的 keyPath,那么,它会在存入时被自动加上这个keyPath 创建表 if (! options参数有两个可设置属性,见 5.记录 一节 keyPath autoIncrement 上图所示是设置了keyPath的表,我们看到在Key后面有一个括号里,标识了它的Key 记录 一条记录就是一个键值对 键 keyPath。在值对象中,获取一个节点值的属性链式方法的字符串表达 自动生成。 与已有记录的keyPath相同的记录时,将会失败,如果同一张表还有其他操作,将随事务回滚也一起失败。

    1.3K50编辑于 2022-11-17
  • 来自专栏编程

    用Swift写一个响应式编程库

    : String private let callback: (T) -> Void init(object: NSObject, keyPath: String, callback: @escaping (T) -> Void) { self.object = object self.keyPath = keyPath self.callback = callback super.init() object.addObserver (self, forKeyPath: keyPath, options: [.new], context: nil) } override func observeValue(forKeyPath keyPath { guard let keyPath = keyPath, keyPath == self.keyPath, let value = change?[.newKey] as? let observer = KeyValueObserver(object: self, keyPath: #keyPath(text)) { str in sink(.success(str)) }

    1.4K50发布于 2018-01-03
  • 来自专栏正则

    AFNetworking源码探究(二十四) —— UIKit相关之UIProgressView+AFNetworking分类

    animated:self.af_uploadProgressAnimated]; }); } } if ([keyPath animated:self.af_downloadProgressAnimated]; }); } } if ([keyPath 如果keyPath是@"countOfBytesSent",那么就获取countOfBytesExpectedToSend,计算进度百分比,在主线程调用[self setProgress:[object 如果keyPath是@"countOfBytesReceived",那么就获取countOfBytesExpectedToReceive,计算进度百分比,在主线程调用[self setProgress: 如果keyPath是@"state"并且任务是完成状态NSURLSessionTaskStateCompleted,那么就要移除对这几个keyPath的观察者。

    36831发布于 2021-09-03
领券