delegate

[iOS]delegate和protocol

做~自己de王妃 提交于 2019-12-02 09:13:33
今天上班和同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocol和java里interface的概念类似,是Objective-C语法的一部分。 定义protocol如下 @protocol ClassADelegate - ( void ) methodA ; - ( void ) methodB ; @end 那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。 函数是需要被实现的,所以如果对于class如下 @interface ClassB < ClassADelegate > { } @end 就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议, 也就是实现了这一组函数。 有了上面这个头文件,我们就可以放心作调用 ClassB * b = [ [ ClassB alloc ] init ] ; [ b methodA ] ; [ b methodB ] ; 而不用担心出现unrecognized selector sent to instance这种错误了。

iOS 如何优雅地 hook 系统的 delegate 方法?

若如初见. 提交于 2019-12-02 01:54:21
在 iOS 开发中我们经常需要去 hook 系统方法,来满足一些特定的应用场景。 比如使用 Swizzling 来实现一些 AOP 的日志功能,比较常见的例子是 hook UIViewController 的 viewDidLoad ,动态为其插入日志。 这当然是一个很经典的例子,能让开发者迅速了解这个知识点。不过正如现在的娱乐圈,diss 天 diss 地,如果我们也想 hook 天,hook 地,顺便 hook 一下系统的 delegate 方法,该怎么做呢? 所以就进入今天的主题: 如何优雅地 hook 系统的 delegate 方法? hook 系统类的实例方法 首先,我们回想一下 hook UIViewController 的 viewDidLoad 方法,我们需要使用 category,为什么需要 category 呢?因为在 category 里面才能在不入侵源码的情况下,拿到实例方法 viewDidLoad ,并实现替换: 12345678910111213141516171819 #import <objc/runtime.h>@implementation (swizzling)+ (void)load { Method fromMethod = class_getInstanceMethod([self class], @selector

iOS 如何优雅地 hook 系统的 delegate 方法?

你离开我真会死。 提交于 2019-12-02 01:51:28
在 iOS 开发中我们经常需要去 hook 系统方法,来满足一些特定的应用场景。 比如使用 Swizzling 来实现一些 AOP 的日志功能,比较常见的例子是 hook UIViewController 的 viewDidLoad ,动态为其插入日志。 这当然是一个很经典的例子,能让开发者迅速了解这个知识点。不过正如现在的娱乐圈,diss 天 diss 地,如果我们也想 hook 天,hook 地,顺便 hook 一下系统的 delegate 方法,该怎么做呢? 所以就进入今天的主题: 如何优雅地 hook 系统的 delegate 方法? hook 系统类的实例方法 首先,我们回想一下 hook UIViewController 的 viewDidLoad 方法,我们需要使用 category,为什么需要 category 呢?因为在 category 里面才能在不入侵源码的情况下,拿到实例方法 viewDidLoad ,并实现替换: 12345678910111213141516171819 #import <objc/runtime.h>@implementation (swizzling)+ (void)load { Method fromMethod = class_getInstanceMethod([self class], @selector

Feign httpclient文件上传问题记录

限于喜欢 提交于 2019-12-01 18:59:14
Feign httpclient文件上传问题记录 问题说明 原先项目http请求通过feign + ribbon + urlconnection 完成,考虑urlconnection频繁连接释放带来网络及cpu开销问题采用http client作为连接池,升级完后发现发现出现调用下游服务乱码、传文件 文件内容被篡改问题 处理 乱码问题 原先系统feign-core、feign-httpclient使用9.5.0 ,按 GitHub issue 看,这个版本并不是使用utf-8作为编码,导致中文乱码情况,鉴于项目用的版本相对较老,这边只升级到9.6.0解决了乱码问题,之前也有通过feign拦截器处理,但是这样需要判断特定的content-type进行处理,避免麻烦,open-feign强调他们的编码是utf-8,部分版本不是,可以定义为bug,既然是bug,能通过升级解决问题就直接升级了 传文件内容被篡改 有问题找GitHub,还是由于版本问题, 老版本的一个bug ,通过httpclient导致文件上传内容篡改,3.0.3版本修复了,早期项目使用的版本是2.0.1,有点年头,参考了下官方建议要求 Requirements The feign-form extension depend on OpenFeign and its concrete versions: all feign

C#在非UI线程调用UI线程的控件

狂风中的少年 提交于 2019-12-01 18:27:23
首先需要定义一个委托(delegate): private delegate void delegateSetProcessBarVal(int value); 然后定义一个方法来执行具体的操作: private void setProcessBarVal(int value){ this.processBar1.Value = val; } 在需要访问UI线程的时候这样调用: processBar1.BeginInvoke(new delegateSetProcessBarVal(setProcessBarVal),10); 来源: https://www.cnblogs.com/Jeely/p/11711962.html

聊聊spring cloud的CachingSpringLoadBalancerFactory

一世执手 提交于 2019-12-01 13:08:28
序 本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory CachingSpringLoadBalancerFactory spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/ribbon/CachingSpringLoadBalancerFactory.java public class CachingSpringLoadBalancerFactory { protected final SpringClientFactory factory; protected LoadBalancedRetryFactory loadBalancedRetryFactory = null; private volatile Map<String, FeignLoadBalancer> cache = new ConcurrentReferenceHashMap<>(); public CachingSpringLoadBalancerFactory(SpringClientFactory factory) { this.factory = factory; } public

UITableView, UIPickerView为什么要使用delegate模式

醉酒当歌 提交于 2019-12-01 05:34:42
问题: I get that with delegates you are delegating a task to another object. I guess I just don't understand why this is beneficial. 最佳答案: 简而言之, UITableView专注通用功能的实现 -- 你不必考虑如何才能让table view滚动, 不必考虑记录数过多怎么办(怎么重用cell) 不必判断是哪个cell被点击了. UITableView会告诉你, 你只要老老实实的实现它指定的接口, 做一个合格的delegate, 实现与UI无关的业务逻辑就行了. UITableView和Delegate(通常是ViewController) 各司其职 --- 做一件事, 并把它做好. 原文如下: [–] Eoghain 4 points 13 hours ago UITableView is the best example to think of here to get your head around it. What does the UITableView do? Display "cell" objects in a vertical stack Scroll to allow displaying more cells than the

事件和委托

久未见 提交于 2019-12-01 05:01:26
以一个列子开始了解委托更容易些,下面是委托的使用方式: internal delegate void Feedback(int32 value)fb; //使用 public void main() { fb = getsomthing; fb+=getanything; if(fb != null) { fb(321); } fb-=getanything; fb(123); } private void getsomthing(int32 value) { Console.WriteLine($"this value is {value}") } private static void getanything(int32 value) { Console.WriteLine($"this value is anything {value}") } 编译器在遇到 :internal delegate void Feedback (int32 value);语句时会将它编译为一个类,这个类继承 System.MulticastDelegate 基类,而System.MulticastDelegate 又继承自 System.delegate。 这个类也有构造函数,它要求传递两个参数,一个 object 和一个 IntPtr 。把它们保存到内部的字段中(字段是来自基类)

AFNetworking实现原理理解

我与影子孤独终老i 提交于 2019-12-01 04:42:51
NSURLSession: NSURLSession由三个基本模块构成: NSURLSession NSURLSessionConfiguation NSURLSessionTask NSURLSession相对于平时通信中的会话,但本身却不会进行网络数据传输,它会穿件多个NSURLSessionTask去执行每次的网络请求 NSURLSession的行为取决于三个方面。包括NSURLSession的类型、NSURLSessionTask的类型和在创建task时APP是否处于前端 NSURLSession有三种类型 defaultSession将cache和creditials储存于本地 Ephemeral Session对数据更加保密安全,并不会向本地储存任何数据,将cache和creditials储存在内存中,并和Session绑定,当Session销毁时,对应的数据也会被销毁。 backgroundSession可以时APP处于后台时继续数据传输,其行为与defaultSession类似,但是所有的数据传输均由一个非本APP的进程来管理。也有一些功能上的限制。 在创建Session对象时通过NSURLSessionConfigration来配置,可设置Session的delegate Session一但配置完成,就不能修改,除非创建一个新的Session对象。

TimelineWindow

妖精的绣舞 提交于 2019-11-30 16:01:38
// Decompiled with JetBrains decompiler // Type: UnityEditor.Timeline.TimelineWindow // Assembly: UnityEditor.Timeline, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null // MVID: 41FDA4D9-ECBE-4515-81B0-7D37CAD3F950 // Assembly location: E:\2WorkSoft\Unity2018.2\2018.2.3f1\mainfile\Unity\Editor\Data\UnityExtensions\Unity\Timeline\Editor\UnityEditor.Timeline.dll using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.IMGUI.Controls; using UnityEditor.ProjectWindowCallback; using