首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏老沙课堂

    NSProxy 设计消息转发

    结构 @interface NSProxy <NSObject> { Class isa; } NSProxy为基类,和NSObject同级, 专门处理这种代理实现事件。 SRProxy继承于NSProxy 如果继承NSObject 也可以实现功能。 NSProxy 和NSObject比较 继承于NSProxy的类 找实现方法的时候 只会找当前类是否实现 而不找super,如果没找到直接进入消息动态解析,以及消息转发机制。 实验1 如果把SRProxy中的消息转发机制去掉 看一下错误信息 继承NSProxy ? 继承NSObject ? NSProxy没有init方法 只要alloc 既可 实验2 当我们继承于NSProxy 在上述ViewDidLoad 中打印此代码 结果为 NSLog(@"isKindOfClass == %d"

    96920发布于 2019-09-28
  • 来自专栏Helloted

    Runtime应用(四):NSProxy

    我们可以利用NSProxy的特性来模拟多继承 NSProxy is an abstract superclass defining an API for objects that act as stand-ins Subclasses of NSProxy can be used to implement transparent distributed messaging (for example, NSDistantObject NSProxy是与NSObject并列的一个类, 它有两个运行时方法 - (void)forwardInvocation:(NSInvocation *)anInvocation; - (NSMethodSignature Worker.h" @implementation Worker - (void)workHard{ NSLog(@"我可以做工"); } @end 再新建一个类SuperPerson继承自NSProxy @interface SuperPerson : NSProxy + (instancetype)person; @end NSProxy与NSObject不同的是,初始化一个NSProxy只需要

    49320编辑于 2022-06-07
  • 来自专栏工程师的分享

    iOS NSPROXY ARC填坑记

    看来就是这了 接着看proxy和delegate之间的联系 proxy是nsproxy的子类 通过一个弱引用,引用delegate 这里一个知识点:nsproxy作为代理更为轻量,因为 NSProxy 是一个抽象的基类,是根类,与NSObject类似 NSProxy和NSObject都实现了<NSObject>协议 NSObject的所有Category中定义的方法无法在继承NSObject 的代理中完成转发,具体参考 http://tanhao.me/code/160702.html/ 这里使用了nsproxy主要在转发时,进行http截取,然后再进行真正的转发 既然做转发,就在每次转发时打印一下 NSProxy在ARC下,弱引用的属性,会被强制置空,不要怀疑,亲测有效 https://joris.kluivers.nl/blog/2012/03/26/weak-references-to-nsproxy-with-arc 2426222 https://stackoverflow.com/questions/9104544/how-can-i-get-ocmock-under-arc-to-stop-nilling-an-nsproxy-subclass-set-using-a-w

    72820编辑于 2022-08-02
  • 来自专栏Linux云计算网络

    Docker 基础技术之 Linux namespace 源码分析

    */ struct nsproxy *nsproxy; ...... } 其中 nsproxy 结构体定义在 nsproxy.h 中: /* * A structure to contain pointers init_nsproxy; 这个结构是被所有 namespace 所共享的,只要一个 namespace 被 clone 了,nsproxy 也会被 clone。 *new); void free_nsproxy(struct nsproxy *ns); int unshare_nsproxy_namespaces(unsigned long, struct nsproxy 各个 namespace 的初始化 在各个 namespace 结构定义下都有个 init 函数,nsproxy 也有个 init_nsproxy 函数,init_nsproxy 在 task 初始化的时候会被初始化 ...... } 继续跟进 init_nsproxy,在 nsproxy.c 中: struct nsproxy init_nsproxy = { .count = ATOMIC_INIT(

    2.1K40发布于 2018-04-16
  • 来自专栏云计算技术笔记

    Linux Namespace机制简介

    在task_struct中,定义了一个nsproxy的结构体指针。 . /* namespaces */ struct nsproxy *nsproxy; ...... } nsproxy结构体 nsproxy是定义namespace的结构体。 nsproxy被共用所有namespace的tasks所共享。只要一个namespace被clone或者不被使用,那么nsproxy就会被copy。 nsproxy 结构图 图片 默认nsproxy: init_nsproxy是和task一起初始化的。除了mnt_ns 没有进行初始化,其余的namespace都进行了系统默认初始化。 这个函数会给task初始化一个新的nsproxy,然后对nsproxy里面的每个namespace结构体进行创建。

    2.6K10编辑于 2022-09-29
  • 来自专栏Kubernetes

    Linux kernel Namespace源码分析

    struct task_struct { ... /* namespaces */ struct nsproxy *nsproxy; ... } nsproxy *new); void free_nsproxy(struct nsproxy *ns); int unshare_nsproxy_namespaces(unsigned long, struct nsproxy (struct nsproxy *ns) { … } static inline void get_nsproxy(struct nsproxy *ns) { … } ###uts_namespace ##各个namespace的初始化 Kernel中有一个默认的nsproxy为init_nsproxy, init_nsproxy在task initialize的时候会被初始化。 &init_nsproxy, … } 继续跟进init_nsproxy的定义,@ linux-4.4.19/kernel/nsproxy.c #31 struct nsproxy init_nsproxy

    13.7K81发布于 2018-04-13
  • 来自专栏开发内功修炼

    Docker容器里进程的 pid 是如何申请出来的?

    中我们提到了进程的命名空间成员 nsproxy。 . /* namespaces */ struct nsproxy *nsproxy; } Linux 在启动的时候会有一套默认的命名空间,定义在 kernel/nsproxy.c 文件下。 //file:kernel/nsproxy.c struct nsproxy init_nsproxy = { .count = ATOMIC_INIT(1), .uts_ns = &init_uts_ns *old_ns = tsk->nsproxy; if (! 注意传入的参数是 p->nsproxy->pid_ns。

    1.1K10编辑于 2023-03-08
  • 来自专栏c++与qt学习

    Docker容器里进程的 pid 是如何申请出来的?

    中我们提到了进程的命名空间成员 nsproxy。 . /* namespaces */ struct nsproxy *nsproxy; } Linux 在启动的时候会有一套默认的命名空间,定义在 kernel/nsproxy.c 文件下。 //file:kernel/nsproxy.c struct nsproxy init_nsproxy = { .count = ATOMIC_INIT(1), .uts_ns = &init_uts_ns *old_ns = tsk->nsproxy; if (! 注意传入的参数是 p->nsproxy->pid_ns。

    97820编辑于 2023-03-06
  • 来自专栏韩曙亮的移动开发专栏

    【Linux 内核】进程管理 task_struct 结构体 ⑤ ( files 字段 | nsproxy 字段 | 信号处理相关字段 | 信号量和共享内存相关字段 )

    文章目录 一、task_struct 结构体字段分析 1、files 字段 2、nsproxy 字段 3、信号处理相关字段 4、信号量和共享内存相关字段 在 Linux 内核 中 , " 进程控制块 字段 files 字段 , 是一个指针 , 指向 " 打开的文件表 " ; /* Open file information: */ struct files_struct *files; 2、nsproxy 字段 nsproxy 字段是 " 命名空间 " ; /* Namespaces: */ struct nsproxy *nsproxy; 3、信号处理相关字段 下面的几个字段 , 都是 " 信号处理

    1.6K30编辑于 2023-03-30
  • 技术实践 | 如何使用 eBPF 分析容器的安全问题

    1 root bash4026532535 net 2 1 root bash在内核中,进程的基本信息都保存在 task_struct 结构体中,其中也包括了包含命名空间信息的 nsproxy nsproxy 结构体的定义如下所示:struct nsproxy { atomic_t count; struct uts_namespace *uts_ns; struct ipc_namespace 获取PID命名空间 */ $pidns = $task->nsproxy->pid_ns_for_children->ns.inum; /* 3. 获取主机名 */ $cname = $task->nsproxy->uts_ns->name.nodename; /* 4. 在运行之前,还需要给它引入相关数据结构定义的头文件:#include <linux/sched.h>#include <linux/nsproxy.h>#include <linux/utsname.h

    22900编辑于 2025-07-24
  • 来自专栏linux驱动个人学习

    Linux的命名空间详解--Linux进程的管理与调度(二)【转】

    在task_struct 结构中有一个指向namespace结构体的指针nsproxy。 . /* namespaces */ struct nsproxy *nsproxy; ……. } 再看一下nsproxy是如何定义的,在include/linux/nsproxy.h * As soon as a single namespace is cloned or unshared, the * nsproxy is copied */ struct nsproxy { 系统中有一个默认的nsproxy,init_nsproxy,该结构在task初始化是也会被初始,定义在include/linux/init_task.h #define INIT_TASK(tsk) \ { …….. .nsproxy = &init_nsproxy, …….. } 其中init_nsproxy的定义为: struct nsproxy init_nsproxy

    2.3K21发布于 2018-09-14
  • 来自专栏绿盟科技研究通讯

    The Route to Host:从内核提权到容器逃逸

    *nsproxy。 struct nsproxy *nsproxy; ... } nsproxy指针指向了一个struct nsproxy结构体,该结构体的如下所示。 如上文中代码所示,init进程的struct nsproxy结构体有一个特殊的名字init_nsproxy。 init_nsproxy在内核中实现如下: struct nsproxy init_nsproxy ={ .count = ATOMIC_INIT(1), ,该函数接受task_struct和nsproxy结构体指针作为参数,将task_struct中nsproxy指针指向了传进来的参数。

    2.2K20编辑于 2022-04-14
  • 来自专栏开发内功修炼

    动手实验+源码分析,彻底弄懂 Linux 网络命名空间

    每个 task_struct 都要关联到一个 namespace 对象 nsproxy,而 nsproxy 又包含了 netns。 //file:include/linux/sched.h struct task_struct { /* namespaces */ struct nsproxy *nsproxy; ...... } 命名空间的核心数据结构是上面的这个 struct nsproxy。 可见 nsproxy 是已经创建好的 init_nsproxy。再看 init_nsproxy 是如何创建的。 //file: kernel/nsproxy.c struct nsproxy init_nsproxy = { .uts_ns = &init_uts_ns, .ipc_ns = &init_ipc_ns

    2K21编辑于 2022-03-24
  • 来自专栏帅云霓的技术小屋

    虚拟化与云计算硬核技术内幕(31) —— 鹿晗和吴亦凡被棒打CP散的秘密

    我们在Linux源代码中的nsproxy.h 里面可以看到这么一段: (链接: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git /tree/include/linux/nsproxy.h? * * The nsproxy is shared by tasks which share all namespaces. * As soon as a single namespace is cloned or unshared, the * nsproxy is copied. */ struct nsproxy struct time_namespace *time_ns_for_children; struct cgroup_namespace *cgroup_ns; }; extern struct nsproxy

    65410编辑于 2022-09-08
  • 来自专栏正则

    iOS-底层原理36:内存优化(一) 野指针探测

    但是这的话,还有一个问题,就是NSProxy只能做OC对象的代理,所以需要在safe_free中增加对象类型的判断 以下是完整的野指针探测实现代码 引入fishhook image 实现NSProxy的代理子类 <! --1、MIZombieProxy.h--> @interface MIZombieProxy : NSProxy @property (nonatomic, assign) Class originClass 的子类 具体实现 1、创建NSProxy的子类,其实现与上面的MIZombieProxy是一模一样的 2、hook dealloc函数的具体实现 <! = [NSProxy class]) { //获取rootCls的父类,并赋值 rootCls = class_getSuperclass(rootCls); }

    2.9K31发布于 2021-10-28
  • 来自专栏Linux内核那些事

    容器原理之 - namespace

    namespace实现原理 为了让每个进程都可以从属于某一个namespace,Linux内核为进程描述符添加了一个 struct nsproxy 的结构,如下: struct task_struct { ... /* namespaces */ struct nsproxy *nsproxy; ... } struct nsproxy { atomic_t pid_namespace *pid_ns; struct user_namespace *user_ns; struct net *net_ns; }; 从 struct nsproxy rcu_read_unlock(); return pid; } struct pid *find_vpid(int nr) { return find_pid_ns(nr, current->nsproxy

    1.6K21发布于 2020-08-24
  • 来自专栏网罗开发

    iOS 如何解决 NSTimer 循环引用

    ViewController 执行 dealloc 前释放 timer(不推荐) 对定时器 NSTimer 封装 苹果 API 接口解决方案(iOS 10.0 以上可用) 使用 block 进行解决 使用 NSProxy 使用 NSProxy 来解决循环引用 ---- 原理如下图: ? 代码如下: //PFProxy.h #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface PFProxy : NSProxy end 在使用的时候如下代码: #import "ViewController1.h" #import "PFProxy.h" @interface ViewController1 () //使用NSProxy

    1.8K30发布于 2021-04-07
  • 来自专栏搜狗测试

    关于OC代理的问题:self.delegate = self

    Delegate 模式其实就是 NSProxy 设计模式的一种衍生版,它们共同的特点可以理解为都是传递对象的消息,主要区别如下: 1. 两者消息传递方式不同,我们使用 NSProxy 会实现消息转发功能,而 Delegate 一般不会实现,仅作消息传递。 2. Delegate 是一对一的消息传递(A->B),而 NSProxy 可以一对多的进行消息传递(A->B/A->C/A->D)。

    1.7K20发布于 2021-02-09
  • 来自专栏小黑娃Henry

    OC底层探索25-深入浅出BlockOC底层探索25-深入浅出Block

    解决循环引用常见的方式有以下几种: __weak + __strong + dance,利用中介者模式; __block修饰引用对象,同样是利用中介者模式但是需要手动释放引用对象; self作为参数传入; 使用NSProxy 模板类 NSProxy 和 NSObject是同级的一个类,也可以说是一个虚拟类,只是实现了NSObject的协议; @interface HRTestProxy : NSProxy @property (nonatomic, strong, nullable) NSObject *target; @end @implementation HRTestProxy // NSProxy实现逻辑和方法慢速转发一致 selector(say)]; }; //调用 self.block(); } -(void)say{ NSLog(@"%@",self.name); } 通过利用虚基类NSProxy 的特性将self -> block -> self,改为self -> block -> NSProxy的结构,从而完成循环引用的打破; 2、Block结构分析 2.1 block最基本形态 分析结构一定是离不开

    66740发布于 2021-08-09
  • 来自专栏开发内功修炼

    Linux进程是如何创建出来的?

    *nsproxy; } 2.1 进程线程状态 进程线程都是有状态的,它的状态就保存在 state 字段中。 具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中,而进程究竟是属于哪个 namespace,都是在 task_struct 中由 *nsproxy 指针表明了这个归属关系。 //file:include/linux/nsproxy.h struct nsproxy { atomic_t count; struct uts_namespace *uts_ns; struct 地址空间是进程线程最核心的东西,每个进程都有独立的地址空间 3.5 拷贝进程的命名空间 nsproxy 在创建进程或线程的时候,还可以让内核帮我们创建独立的命名空间。 但由于今天我们的例子父子进程是同一个命名空间,所以 nsproxy 还仍然是共用的。 其中 mm_struct 是一个非常核心的数据结构,用户进程的虚拟地址空间就是用它来表示的。

    2.6K21编辑于 2022-12-07
领券