Objective-C:如何在运行时更改对象的类?

2024-01-10

我试图回答将 UITableView 子类与 UITableViewController 一起使用 https://stackoverflow.com/questions/874906/using-a-uitableview-subclass-with-a-uitableviewcontroller with ISA 交换 https://stackoverflow.com/a/679866/242933像这样:

self.tableView->isa = [MyTableView class];

但是,我收到编译错误:Instance variable 'isa' is protected.

有办法解决这个问题吗?如果是这样,这样做安全吗?

我问是因为@AmberStar 对这个问题的回答 https://stackoverflow.com/a/874989/242933似乎略有缺陷。 (请参阅我的评论。)


如果您的表视图类提供任何存储,这将会中断。我不会推荐你要走的路。但正确的方法是使用object_setClass(tableView, [MyTableView class]).

请确保这确实是您想要的。

这是一个小代码示例,展示了这是一个多么糟糕的想法。

#import <objc/runtime.h>

@interface BaseClass : NSObject
{
    int a;
    int b;
}
@end

@implementation BaseClass

@end

@interface PlainSubclass : BaseClass
@end

@implementation PlainSubclass
@end

@interface StorageSubclass : BaseClass
{
@public
    int c;
}
@end

@implementation StorageSubclass
@end



int main(int argc, char *argv[])
{
    BaseClass *base = [[BaseClass alloc] init];
    int * random = (int*)malloc(sizeof(int));
    NSLog(@"%@", base);

    object_setClass(base, [PlainSubclass class]);
    NSLog(@"%@", base);

    object_setClass(base, [StorageSubclass class]);
    NSLog(@"%@", base);
    StorageSubclass *storage = (id)base;
    storage->c = 0xDEADBEEF;
    NSLog(@"%X == %X", storage->c, *random);
}

和输出

2011-12-14 16:52:54.886 Test[55081:707] <BaseClass: 0x100114140>
2011-12-14 16:52:54.889 Test[55081:707] <PlainSubclass: 0x100114140>
2011-12-14 16:52:54.890 Test[55081:707] <StorageSubclass: 0x100114140>
2011-12-14 16:52:54.890 Test[55081:707] DEADBEEF == DEADBEEF

正如你所看到的写入storage->c写入为实例分配的内存之外,并写入我为随机分配的块中。如果那是另一个物体,你就摧毁了它isa指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C:如何在运行时更改对象的类? 的相关文章

  • iOS UIView子类,将透明文本绘制到背景

    我想将文本绘制到 UIView 上的子类上 以便文本从形状中切出 并且视图后面的背景显示出来 就像在 OSX Mavericks 徽标中找到的那样here http www n3rdabl3 co uk wp content uploads
  • 图像高斯模糊 - iOS 8

    我有一个移动的背景图像 我想模糊它的底部 我would只用 Photoshop 就能做到 但由于图像会移动 效果不太好 这就是我的意思 看图片底部 基本上就像底座对 iPhone 的影响一样 我使用的是 iOS 8 但不是 Swift 我根
  • 错误域=NSURLErrorDomain代码=-1017“该操作无法

    我刚刚开始 ios 开发 我正在尝试与我的 api 交换数据 当我执行 POST 请求时 一切正常 但当我尝试执行 GET 请求时 出现以下错误 错误域 NSURLErrorDomain代码 1017 该操作无法 完全的 NSURLErro
  • GCD 和线程

    我想了解一些有关 GCD 和线程的知识 我的视图控制器中有一个 for 循环 它要求我的模型执行一些异步网络请求 因此 如果循环运行 5 次 模型将发出 5 个网络请求 考虑到我正在使用 NSURLConnection 的 sendAsyn
  • 创建自定义 MCBrowserViewController

    有没有办法创建一个UITableView包含在中找到的相同信息MCBrowserViewController 我当前的代码只允许推送与我的应用程序设计不同的标准视图 self browserVC MCBrowserViewControlle
  • &(与符号)和 && 或 | 之间的区别(管道)和||在 Objective-C 中?

    我想知道Objective C是否关心我是写 还是 我相信一个与号 会或应该导致如果左侧已经为假 则右侧将不会被评估 这适用于 Objective C 吗 Yes 这些运算符在 C 和 Objective C 中的功能相同 就像在 C 中一
  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • 如何在 UITableView 中显示零行的表格

    我正在动态地将内容加载到 UITableView 中 如果有数据 表格需要显示数据 如果没有数据 表格应显示普通页面 但在我的应用程序中 表格显示带有两条分隔线的普通页面 我需要删除此分隔线并显示纯白色页面 请建议 任何帮助 将不胜感激 如
  • iPhone - 创建自定义 UITableViewCell 顶部和底部边框

    我一直在到处寻找 但还没有找到我的答案 我使用 JSON 中的动态单元格填充 UITableView 并尝试隐藏任何额外的单元格 我关闭了IB中的分隔符 当然所有的单元格分隔符都消失了 如何在每个 tableviewcell 的底部和顶部添
  • Swift 相当于 Objective-C FourCharCode 单引号文字(例如 'TEXT')

    我正在尝试在 Swift 中复制一些 Objective C cocoa 一切都很好 直到我遇到以下情况 Set a new type and creator unsigned long type TEXT unsigned long cr
  • 如何将 NSSecureCoding 与 id 对象一起使用

    我正在创建一个链接列表并使用容器对对象 下一个和上一个属性进行分组 就像基金会收藏一样 我希望它能够实现NSSecureCoding 这是声明 interface ListContainer NSObject
  • UITableView:显示 tableFooterView 时运行代码?

    我正在使用 UIView表页脚视图 http developer apple com library ios documentation uikit reference UITableView Class Reference Referen
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc
  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • 如何在没有 SDK 的情况下在 Objective C 中为 S3 创建预签名 URL?

    我正在构建一个 mac 应用程序not使用 AWS iOS 开发工具包 我尝试构建的 GET 请求应遵循以下通用格式 Authorization AWS AWSAccessKeyId base64 hmac sha1 VERB n CONT
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • 为什么 Objective-C 允许在方法定义末尾使用分号? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 实现文件中方法名后面的分号 https stackoverflow com questions 5678360 semicolon after the method name

随机推荐

  • 使用辅助方法为 Java 对象生成测试数据时提供默认值

    假设有以下 POJO Getter Setter public class UserRequest private String username private String password private String email 现
  • iPhone 的 JSON 库

    我想在我的 iPhone 项目中使用 JSON 库 我发现 json framework 库是目前最流行的 在这里能找到它 http code google com p json framework http code google com
  • 使用 Java 发送零数据 TCP/IP 数据包

    我的目标是发送一个带有空数据字段的 TCP 数据包 以便测试与远程计算机的套接字 我正在使用 OutputStream 类的 write byte b 方法 我的尝试 outClient ClientSocket getOutputStre
  • Angular ng 服务不在本地主机上托管站点

    当我跑步时ng serve在我的 CLI 上 我得到以下输出 Angular Live Development Server 正在监听 localhost 4200 打开浏览器 http localhost 4200 但是当我在浏览器中打开
  • azure devops 本地代理管道权限被拒绝

    我有一个 python 脚本 可以在远程 SUT 上执行自动化脚本 并且考虑到该脚本在使用用户 tester 和密码 xxx 在本地执行时正常工作 当我构建 DevOps Azure 管道时 我已从 GIT 将项目签出到代理中 然后尝试从命
  • PHP 中传递给 exec 的命令长度有限制吗?

    目前我需要将 50 多个 PDF 文件合并为 1 个 PDF 我正在使用 PDFTK 使用以下指南 http www johnboy com blog merge multiple pdf files with php http www j
  • 如何关闭hbm2ddl?

    我找不到有关如何关闭 hbm2ddl 的参考 只是省略hibernate hbm2ddl auto默认情况下 Hibernate 不执行任何操作 来自参考文档 1 1 4 休眠配置 http docs jboss org hibernate
  • Mysql 查询发布日期减去 7 天

    这不断出现错误 我不明白为什么 SELECT i user id FROM SELECT SUM us score AS score sum us user id FROM user scores us WHERE us created g
  • 特殊字符未按预期显示

    我有以下简单的 HTML 页面 div m ywe div 当在 Chrome 或 Firefox 中显示它时 我没有测试其他浏览器 我看到以下内容 m ywe 我错过了什么 html 文件以 UTF 8
  • 将 JSON 数据写入磁盘

    编写 JSON 数据 NSDictionary 并再次读取它的最简单方法是什么 我知道有 NSFileManager 但是有没有一个开源框架库可以使这个过程变得更容易 iOS5 NSJSONSerialization 类是否支持将数据写入磁
  • 带有 jquery 的 Django 模板:现有页面上的 Ajax 更新

    我有一个带有表单的 Google App Engine 当用户单击提交按钮时 将调用 AJAX 操作 服务器将输出一些内容并附加到其来源页面的末尾 怎么样 我有一个 Django 模板 我打算使用 jquery 我有以下观点 welcome
  • 传感器的本机模块不可用。 React-Native链接运行成功了吗?

    我遵循了第一步React Native教程在这里 https facebook github io react native docs getting started html https facebook github io react
  • 在 Primefaces 中的不同布局单元之间拖放

    我在全页 Primefaces 布局中有 4 个布局单元 我在西布局单元中有输出标签 我想将其拖放到中心布局单元 我想要将输出标签拖放到此处的拖放区域是 tabView 中的一个面板 当我开始拖动outputLabel时 它不会从西布局单元
  • Snakemake:如何记录由 script 指令执行的 python 脚本?

    有没有什么方法可以轻松保存来自snakemake规则执行python脚本的日志script指示 该脚本使用的库已经有一些集成的日志记录 我想存储它们的日志 我不想使用shell or run指令 因为在使用 python 脚本时它们都不太舒
  • 用于读写的 Java FileLock

    我有一个进程 会从 cron 中频繁调用来读取其中包含某些与移动相关的命令的文件 我的进程需要读取和写入此数据文件 并将其锁定以防止其他进程在此期间接触它 用户可以执行完全独立的过程来 可能 写入 附加到同一数据文件 我希望这两个进程能够正
  • 在 Heroku 应用程序之间共享 Python 代码

    我有 2 个 Heroku 应用程序 都是 Pyhon 以及它们之间共享的一些 python 模块 即 它们在两个应用程序中是相同的 设置 git requirements txt 以实现以下目标的最佳方法是什么 共享代码是版本化的 也就是
  • 有没有办法在打字稿中实例化通用文字类型?

    我想做一些可能非正统的事情 如果我们诚实的话 几乎没有用 所以我们开始 我想传递一个文字作为通用参数 然后实例化它 考虑以下示例 const log console log class Root
  • 在 apache httpd 反向代理和 Tomcats 之间进行双向 SSL 身份验证

    我有一个 Apache HTTPD 作为反向代理 还有 Tomcat 6 0 35 服务器 我想要实现的是 Tomcat 服务器和反向代理之间存在相互信任 这意味着当反向代理转发请求时 它将提供自己的证书 该证书将被导入到 Tomcat 的
  • Bash 管道到 python

    我需要通过管道实时吸收 bash 命令的输出 例如 for i in seq 1 4 do echo i sleep 1 done script py script py 哪里有这个 for line in sys stdin readli
  • Objective-C:如何在运行时更改对象的类?

    我试图回答将 UITableView 子类与 UITableViewController 一起使用 https stackoverflow com questions 874906 using a uitableview subclass