42_iOS干货29_isa指针和superClass指针的总结

1,isa指针的作用

  • 实例对象instance的isa指向class,当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
  • 类对象class的isa指向meta-class,当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
     

2,supreClass指针的作用

  • 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用

3,图表详解isa和superClass指针

  1. instance的isa指向class
  2. class的isa指向meta-class
  3. meta-class的isa指向基类的meta-class
  4. class的superclass指向父类的class,如果没有父类,superclass指针为nil
  5. meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class

4,子类实例对象调用父类对象方法的轨迹

  1. 实例对象isa指针 -> 类对象方法列表没有 -> 类对象的superClass指针 ->找到实例方法
  2. (找不到则继续到父类找,否则报经典错误cunrecognise selector sent to instance)

 

5,子类类对象调用父类类方法的轨迹

  1. 类对象isa指针 ->元类对象列表没有 ->元类对象的superClass指针 ->找到该类方法
  2. (找不到则继续从元类的父类找,特别注意NSObject元类对象的superClass指针,指向NSObjec的类对象,没有则报经典错误cunrecognise selector sent to class)
  3. 有可能调用类方法的时候,最后找到NSObject中的对象方法,存在这种可能性
<think>首先,用户的问题是关于Windows API开发中的DECLARE_WND_SUPERCLASS宏。用户提供了几个引用,我需要基于这些引用来构建回答。 引用内容: - [^1]: DECLARE_WND_SUPERCLASS宏有两个参数:新注册的控件名称继承的窗口类型。它允许继承一个已注册的窗口类型并使用自定义窗口过程。 - [^2]: 使用DECLARE_WND_SUPERCLASS时,会注册一个新Windows类,与现有类相同,但替换窗口过程为CWindowImpl::WindowProc或重写的函数。 - [^3]: 宏的定义代码,显示它定义了GetWndClassInfo函数,返回一个CWndClassInfo结构,其中包含新窗口类的信息。 - [^4]: 提到超类化(Superclass子类化(Subclass),并引用了CWindowImplBaseT::WindowProc函数。 - [^5]: CContainedWindowT在内部生成一个新类,将消息转发给父窗口,避免创建新类。 用户需求:查找与Windows窗口超类声明相关的技术信息,特别是DECLARE_WND_SUPERCLASS宏。 系统指令: - 所有行内数学表达式用$...$格式(但这里可能不涉及数学)。 - 独立公式用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(在文本中,确保正确)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题。 - 参考站内引用,确保回答真实可靠。 回答结构: 1. **解释DECLARE_WND_SUPERCLASS宏的作用**:基于引用,描述它如何用于窗口超类化。 2. **工作原理**:解释宏如何注册新窗口类并替换窗口过程。 3. **使用示例**:可能基于引用提供简单示例。 4. **相关概念**:讨论超类化与子类化的区别。 5. **实际应用**:提到CContainedWindowT如何简化事情。 6. **生成相关问题**:在末尾添加相关问题。 确保语言中文: - 整个回答用中文写。 添加引用标识: - 在引用具体内容时,在末尾添加[^1]、[^2]等。 生成相关问题: - 在回答末尾,添加"§§相关问题§§"部分,列出2-3个相关问题。 现在,构建回答: - **开头**:简要介绍DECLARE_WND_SUPERCLASS宏。 - **详细解释**: - 宏的参数:新窗口类名原始窗口类名。 - 它注册一个新类,继承原始类的属性,但替换窗口过程。 - 引用宏定义代码[^3]。 - 讨论超类化 vs. 子类化[^4]。 - 提到CContainedWindowT的替代方法[^5]。 - **结尾**:总结其重要性。 - **相关问题**:基于主题生成问题。 相关问题示例: 1. DECLARE_WND_SUPERCLASS宏在实际项目中的使用案例? 2. 超类化与子类化的主要区别是什么? 3. 如何在ATL中使用CContainedWindowT简化窗口处理? 确保回答真实可靠:基于提供的引用,不要添加虚构信息。</think>### DECLARE_WND_SUPERCLASS宏在Windows API开发中的技术解析 在Windows API开发中,`DECLARE_WND_SUPERCLASS`宏是ATL(Active Template Library)提供的一个关键工具,用于实现窗口超类化(Superclassing)。超类化允许开发者创建一个新的窗口类,该窗口类继承自一个已存在的窗口类(如标准按钮或编辑框),但替换其窗口过程函数(Window Procedure),从而在不修改原始类的情况下扩展或自定义窗口行为。以下我将基于技术引用逐步解释其工作机制、使用方法相关概念,确保回答真实可靠。 #### 1. **宏的作用与参数** - `DECLARE_WND_SUPERCLASS`宏有两个参数: - `WndClassName`:要注册的新窗口类名称(例如`"XButton"`),这个名称必须是唯一的。 - `OrigWndClassName`:原始已注册的窗口类名称(如`"BUTTON"`或`"EDIT"`),新类将继承其属性行为。 - 宏的核心功能是注册一个新窗口类,该新类克隆原始类的所有特性(如样式、图标光标),但使用自定义的窗口过程函数替代原始过程。这样,开发者可以拦截处理消息(如鼠标点击或键盘事件),实现控件行为的扩展[^1][^2]。 #### 2. **工作原理:注册新类与替换窗口过程** - 当使用`DECLARE_WND_SUPERCLASS`时,ATL在内部生成一个静态的`CWndClassInfo`结构,该结构定义了新窗口类的属性。宏的定义代码如下(基于引用[^3]): ```cpp #define DECLARE_WND_SUPERCLASS(WndClassName, OrigWndClassName) \ static CWndClassInfo& GetWndClassInfo() \ { \ static CWndClassInfo wc = \ { \ { sizeof(WNDCLASSEX), 0, StartWindowProc, \ 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \ OrigWndClassName, NULL, NULL, TRUE, 0, _T("") \ }; \ return wc; \ } ``` - 这里,`GetWndClassInfo()`函数返回一个`CWndClassInfo`对象,其中: - `WNDCLASSEX`结构体指定了新类的名称(`WndClassName`)窗口过程(`StartWindowProc`,这是一个ATL内部函数,最终会路由到`CWindowImpl::WindowProc`)。 - `OrigWndClassName`指向原始类,确保新类继承其基础属性。 - 实际窗口过程被替换为`CWindowImpl::WindowProc`或开发者重写的函数。这使得所有发送到该窗口的消息(如`WM_PAINT`或`WM_COMMAND`)首先被自定义过程处理,开发者可以添加日志、验证或绘图逻辑[^2][^4]。 #### 3. **超类化 vs. 子类化:关键区别** - **超类化(Superclassing)**:在窗口类级别操作,注册一个新类来替换整个类的行为。这适用于创建可重用的自定义控件(如增强型按钮)。`DECLARE_WND_SUPERCLASS`正是用于此场景,它允许在运行时动态修改窗口过程[^1][^4]。 - **子类化(Subclassing)**:在窗口实例级别操作,通过`SetWindowLong`或`SubclassWindow`修改特定窗口实例的消息处理。这更轻量级,但不改变类本身。 - 区别总结:超类化影响所有基于新类的窗口实例,而子类化仅针对单个窗口。超类化更适合框架级扩展,子类化适合临时修补[^4]。 #### 4. **实际应用与简化方法** - 在ATL中,`DECLARE_WND_SUPERCLASS`常用于派生窗口类。例如,创建一个自定义按钮: - 定义一个新类使用该宏:`DECLARE_WND_SUPERCLASS("MyButton", "BUTTON")`。 - 重写`WindowProc`函数处理消息,如添加点击动画。 - 替代方案:引用[^5]提到`CContainedWindowT`类可以简化此过程。它内部生成一个新类,并将所有消息转发给父窗口(如对话框),避免手动创建新类。这在对话框资源中处理控件消息时更高效,因为消息可直接在父窗口的消息映射中处理[^5]。 - 优点:超类化提供更大的灵活性,但需注意窗口类注册的全局影响(如类名冲突)。在性能上,ATL优化了消息路由,开销较小。 #### 5. **开发注意事项** - **正确使用**:确保在ATL项目中使用,并包含`atlwin.h`头文件。注册新类通常在窗口创建前完成(如在`InitInstance`中)。 - **常见错误**:如果原始类未注册或参数错误,注册失败可能导致窗口创建失败。调试时,使用`GetLastError`检查错误码。 - **参考文档**:Microsoft官方ATL文档是权威来源,但引用内容已涵盖核心机制。实际开发中,结合示例代码测试更可靠[^2][^3]。 总之,`DECLARE_WND_SUPERCLASS`是Windows API开发中实现窗口自定义的强大工具,特别适用于需要创建可复用控件的场景。通过超类化,开发者可以高效扩展标准控件功能,而无需修改系统级代码[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值