Objective-c 类运行时定义

2023-12-27

是否可以在 Objective-C 中在运行时定义类?
例如。我收到一个 XML 文件,该文件定义了一个对象并创建它并在运行时使用它?


是的,检查一下这个代码片段,我在这里创建了一个类,仅使用 C 方法和一个协议定义(为了在进行消息调用时简单起见)...

MyCObject.h

#import <Foundation/Foundation.h>

@protocol MyCObj_methods<NSObject>

-(NSString *) getString;
-(int) getInt;
+(NSString *) someStaticMethod;

@end

typedef id<MyCObj_methods> MyCObj;
extern Class MyCObj_class;

__attribute__((constructor))
void MyCObj_initialize();

MyCObj MyCObj_alloc(        id self,     SEL _cmd );
MyCObj MyCObj_new(          id self,     SEL _cmd );

NSString *MyCObj_someStaticMethod ( id self, SEL _cmd );

MyCObj MyCObj_init(         MyCObj self, SEL _cmd );
NSString *MyCObj_getString( MyCObj self, SEL _cmd );
int MyCObj_getInt(          MyCObj self, SEL _cmd );

MyCObject.m

#import "MyCObject.h"
#import <objc/Object.h>
#import <objc/runtime.h>

static Class myStaticClass;
Class MyCObj_class;

typedef struct
{
    Class isa;
    NSString *myString;
    int myInt;
} MyCObj_t;

void MyCObj_initialize(void);

__attribute__((constructor))
void MyCObj_initialize()
{
    MyCObj_class = objc_allocateClassPair([NSObject class], "MyCObj", 0);
    objc_registerClassPair(MyCObj_class);

    myStaticClass = object_getClass(MyCObj_class);

    class_addMethod(MyCObj_class, @selector(init),      (IMP)MyCObj_init,        "@@:");
    class_addMethod(MyCObj_class, @selector(getString), (IMP)MyCObj_getString,   "@@:");
    class_addMethod(MyCObj_class, @selector(getInt),    (IMP)MyCObj_getInt,      "i@:");

    class_addMethod(myStaticClass, @selector(alloc),            (IMP)MyCObj_alloc, "@@:");
    class_addMethod(myStaticClass, @selector(new),              (IMP)MyCObj_new,   "@@:");
    class_addMethod(myStaticClass, @selector(someStaticMethod), (IMP)MyCObj_someStaticMethod, "@@:");
}

MyCObj MyCObj_alloc(id self, SEL _cmd)
{
    return (MyCObj) class_createInstance(MyCObj_class, sizeof(MyCObj_t) - sizeof(Class));
}

MyCObj MyCObj_new(id self, SEL _cmd)
{
    return (MyCObj) [[MyCObj_class alloc] init];
}

NSString *MyCObj_someStaticMethod(id self, SEL _cmd)
{
    return @"Some Static Method";
}

MyCObj MyCObj_init(MyCObj self, SEL _cmd)
{
    struct objc_super super = { .receiver = self, .super_class = [NSObject class] };

    if ((self = (MyCObj) objc_msgSendSuper(&super, _cmd)))
    {
        ((MyCObj_t *) self)->myString = @"hello world!";
        ((MyCObj_t *) self)->myInt = 15;
    }

    return self;
}

NSString *MyCObj_getString(MyCObj self, SEL _cmd)
{
    return ((MyCObj_t *) self)->myString;
}

int MyCObj_getInt(MyCObj self, SEL _cmd)
{
    return ((MyCObj_t *) self)->myInt;
}

Usage:

MyCObj obj = [MyCObj_class new];
NSLog(@"%@ %i %@", [obj getString], [obj getInt], [MyCObj_class someStaticMethod]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-c 类运行时定义 的相关文章

  • 如何在 UILabel.text 中添加制表符空间

    我有一个 UILabel 实例 比如 mylabel 我想做的是这样的 mylabel text Age tLimit tYear instead of mylabel text Age Limit Year 但当我尝试时 t 未被识别 如
  • AVPlayerLayer获取图像到UIImageView缓冲区

    我尝试 playerLayer renderInContext UIGraphicsGetCurrentContext 它将显示黑色背景 所以我得到当前播放器项目作为连续的重击图像 它看起来不像视频播放 只是静态图像连续流动 那么还有其他选
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • TDD iOS 教程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您好 我正在寻找非常好的 iOS TDD 教程 请您帮助我 什么是最好的 iOS TDD 书籍 博客
  • 最近打开的应用程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有什么方法可以获取最近打开的应用程序 例如 4 个 的列表吗 如果是这样 怎么办 可可麦克 看看LaunchServices LSSh
  • 在 uilabel 中查找文本的位置 {x,y}

    我有一个来自服务器的字符串 我正在 UILabel multiligne 上显示它 在该字符串中 我正在识别一些特定的子字符串 我想在该子字符串上放置一个按钮 按钮将是 UILabel 的子视图 为此 我需要子字符串坐标 我经历过这个 但我
  • 您是否标记 UIView 或将它们保留为属性?

    这主要是一个风格问题 但自从我开始为 iPhone 编程以来 我一直很好奇其他人的想法是什么 当您的 iPhone 应用程序中有一个 UIView 并且需要在应用程序的其他位置访问它时 通常在视图控制器中的另一个函数中 您是否喜欢用整数标记
  • 是否有针对不同屏幕尺寸的单独故事板?

    基本上我已经完成了一个应用程序 我唯一的问题是 ATM 机应用程序在设计时只考虑了 4 英寸显示屏 当在 3 5 英寸模拟器上运行时 应用程序会丢失 0 5 英寸 显然 那么我的问题是 如何在 Xcode 5 中为不同的屏幕尺寸设置不同的故
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 如何在 NSTextView 中使用 SPACE 而不是 TAB

    我只知道如何修改 NSTextView 中的制表符宽度 NSMutableParagraphStyle paragraphStyle self defaultParagraphStyle mutableCopy paragraphStyle
  • 如何判断 NSObject 是否具有某个属性?

    假设在 Apple API 1 0 版中 有一个 NSFoo 类 其属性为 color API 1 1 添加了属性 size 我想知道是否可以使用 getter myFoo size myFoo respondsToSelector sel
  • 有什么方法可以询问方法的名称吗?

    我正在尝试调试我正在开发的 iPhone 应用程序 向各种源文件添加 50 条 NSLog 语句的想法让我感到很兴奋 我想做的是写一对陈述 比如 NSString methodName self methodName NSLog metho
  • 使用 UITabBarController 时覆盖整个屏幕的视图?

    我想在 UITabBarController 设置中在整个屏幕上覆盖 HUD 样式的透明图形 执行此操作的按钮位于第一个选项卡的屏幕 FirstViewController 中 并且覆盖层也应该覆盖选项卡 这可能吗 您可以将新视图直接附加到
  • iOS7 由 Interface Builder 生成的 NSIBPrototypingLayoutConstraint 自动布局约束问题

    以前在 iOS6 中 我的聊天消息视图控制器使用 IB 中精心构建的自动布局约束正确显示和动画 下面是 Xcode 5 中删除了约束的当前视图层次结构 升级到 XCode 5 和 iOS7 后 我发现我需要清除所有旧的约束才能解决默认的半透
  • 在 Objective-C 中的 Swift 类上调用 NSStringFromClass 返回模块损坏的名称

    我知道这个问题 https stackoverflow com questions 24107658 get a user readable version of the class name in swift in objc nsstri
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 从 HTML5 Canvas 导出矢量图形

    我很好奇这可能吗 我有兴趣在 HTML5 中构建一个矢量绘图应用程序 它能够保存为矢量 而不仅仅是 JPG PNG BMP Thanks 不 这是不可能的 绘图操作完成后 剩下的一切都在canvas是一堆像素 您必须保留所有绘图选项 然后使
  • 在 Visual Studio 中创建 hpp 文件

    当我要使用 Visual Studio 将新文件添加到项目中并且我希望它是 hpp only h文件可用 如何创建 hpp files 添加新文件时 您可以将扩展名更改为您想要的任何内容 只需将名称从 Header h 或它为您提供的任何默
  • Java HttpURLConnection - 带 Cookie 的 POST

    我正在尝试发送带有 cookie 的发布请求 这是代码 try String query URLEncoder encode key UTF 8 URLEncoder encode value UTF 8 String cookies se
  • 反序列化时二进制流“0”不包含有效的 BinaryHeader 错误

    在过去两天寻找这个问题的答案后 我希望这里有人能提供帮助 我使用 VS2012 用 c 编写了一个程序 该程序使用 BinaryFormatter 保存用户的项目数据 以将可序列化的类序列化为 Stream 然后再将其保存到文件中 该程序已
  • JavaScript 数组上的 getter/setter?

    有没有办法在数组上获取 设置行为 我想象这样的事情 var arr one two three var arr new Array for var i 0 i lt arr length i arr i defineGetter value
  • 如何从 ngModel 渲染 HTML 标签?

    我使用 AngularJS 将 JS 变量绑定到我的 HTML 内容 它工作得很好 JS var app angular module Tabs controller TabsController scope function scope
  • 如何以唯一的顺序对数组进行排序

    给定一个数组 var myList Normal Urgent Alert Casual Follow up 我想以下拉菜单的形式输出这个列表 我想 Urgent 首先出现 然后是 Alert 其余的应按字母顺序排序 我知道我可以按字母顺序
  • 如何在 Hapi 中获取请求的完整 URL

    在我的 hapijs 应用程序中 给定Request object http hapijs com api request object 如何找到原始的 未解析的 未修改的 URL function getRequestUrl reques
  • 您使用 Matlab/F#/R 进行数据分析和建模算法的经验

    我已经使用 F 一段时间来对算法进行建模 然后再用 C 进行编码 之后还使用它来检查 C 代码的结果 以及对照实际记录的数据 对于建模方面 它非常方便 但对于 数据混搭 之类的东西 从 CSV 和其他来源提取数据 生成统计数据 绘制图表等
  • 无法将 RoboMongo 与 Amazon 实例连接

    我无法将 RoboMongo 与 Amazon 实例连接 试过这个http blog mongohq com robomongo your next shell http blog mongohq com robomongo your ne
  • Django ModelForm 有一个隐藏的输入

    所以我有我的 TagStatus 模型 我正在尝试为其制作一个 ModelForm 但是 我的表单要求用 tag name 填充隐藏输入 我一直在浏览文档 但不知道如何使标签字段成为隐藏输入 也许 ModelForm 不是正确的选择 模型
  • 如何使用 Android ZoomButtonsController?

    好吧 我已经无计可施了 我不知道该怎么做使用 android widget ZoomButtonsController http developer android com reference android widget ZoomButt
  • 为什么我的 base64 编码的 png 在我的 svg 中不可见?

    我想将 png 转换为 base64 并将编码后的字符串插入 svg 中 fIm open name png rb dataIm fIm read encode base64 replace n baseIm
  • Java 语言规范中是否曾经发生过“重大变化”?

    除了引入 assert 关键字这一可能广为人知的例外情况之外 Java 语言规范是否曾发生过变化 导致旧代码不再与 JDK 的较新源代码级别兼容 到目前为止的总结 非常感谢您的评论 当升级到更高版本时 如果代码使用使用 Java 语言规范
  • Android:单击按钮时转到 HTTP URL

    我想通过单击 Android 应用程序中的按钮来访问网页 比如说 我有一个名为 Google 的按钮 当用户单击该按钮时 我希望 google com 在屏幕上打开 这是如何实现的 另外 当用户使用完 Google 后 有没有办法可以重新获
  • python:动态获取字典中的子字典?

    假设我想编写一个函数 它将从字典返回任意值 例如 mydict foo bar baz 如果不存在则返回空字符串 不过 我不知道是否mydict foo 必然存在 更不用说mydict foo bar baz 我想做这样的事情 safe n
  • 在 Safari 中使用 location.hash 滚动页面

    我有一个论坛页面 在当前选定的消息下方显示消息的树视图 当您单击树中的消息时 新消息正文将加载到div使用 AJAX 靠近页面顶部 然后运行以下代码 window location hash page top 当然 page top 是页面
  • LLVM 的整数类型

    LLVM语言将整数类型指定为iN 其中N是整数的位宽 范围从1到2 23 1 根据 http llvm org docs LangRef html integer type http llvm org docs LangRef html i
  • 如何处理所有可用 iPhone 分辨率上的图像比例?

    什么尺寸最适合用于图像 background png 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection例如 如果我们想使用此图像来覆盖 iPh
  • Objective-c 类运行时定义

    是否可以在 Objective C 中在运行时定义类 例如 我收到一个 XML 文件 该文件定义了一个对象并创建它并在运行时使用它 是的 检查一下这个代码片段 我在这里创建了一个类 仅使用 C 方法和一个协议定义 为了在进行消息调用时简单起