新的 Clang Objective-C 文字可以重定向到自定义类吗?

2024-04-01

虽然超载@开始踏上危险的领域,我喜欢在 Clang 3.1 中添加新的 Objective-C 文字。不幸的是,新的文字对我来说用处有限。除了代码需要与 AppKit 交互的情况外,我大多放弃使用基础类,转而使用我自己的自定义框架(出于多种原因;其中大部分是我需要直接控制所使用的内存分配模式通过对象)。

我总是可以使用一些运行时技巧来将新创建的对象传递为我的自定义类(这就是我已经必须处理的字符串对象文字,因为只有非 Apple GCC 运行时支持-fconstantstring=class标志),但这充其量只是一种黑客攻击,并且放弃了我通过替换等效的基础类而获得的所有好处。

与字符串对象文字不同,Clang 实现的新文字实际上并不是常量类(其中内存布局是硬编码的);相反,适当的消息被发送到各自的类,以在运行时创建和初始化新对象。其效果与您自己创建该对象没有什么不同。理论上,这意味着新文字所使用的类和调用的方法不是硬编码的。在实践中,我找不到任何方法来更改它们以指向我自己的自定义类和方法(事实上,我很乐意只指向自定义类;在运行时将虚拟方法指向实际方法并不困难)。

当我第一次研究这个时,我真的希望找到一组可以用来完成我所要求的事情的标志,但由于我还没有找到任何标志,我希望有人能找到解决方案。


您可以用 class 替换某些 Objective-C 文字@compatibility_alias关键词技巧。

这是一个例子。

@compatibility_alias NSNumber AAA;

当然,您应该为新类提供正确的实现。

#import <Foundation/NSObject.h>

@interface  AAA : NSObject
+ (id)numberWithInt:(int)num;
@end

@implementation AAA
+ (id)numberWithInt:(int)num
{
    return  @"AAAAA!!!";    // Abused type system just to check result.
}
@end

@compatibility_alias NSNumber AAA;

现在 Clang 将为您完成这项工作。我确认这适用于数字、数组、字典文字。不幸的是,字符串文字似乎是静态发出的,因此它不起作用。

欲了解更多信息@compatibility_alias关键词,see here https://stackoverflow.com/questions/178434/what-is-the-best-way-to-solve-an-objective-c-namespace-collision#180674.

Note

Because @compatibility_alias关键字是适用于当前编译单元的编译器指令,您需要将编译单元分开以避免与Apple Foundation Kit中的NSObject类重复符号。我是这样做的。

main.m

#import "test.h" // Comes before Foundation Kit.
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        NSLog(@"return of test = %@", test());
        // insert code here...
        NSLog(@"Hello, World!");

    }
    return 0;
}

test.h

id test();

test.m

#import "test.h"
#import <Foundation/NSObject.h>

@interface  
AAA : NSObject
+ (id)numberWithInt:(int)v;
+ (id)arrayWithObjects:(id*)pobj count:(int)c;
+ (id)dictionaryWithObjects:(id*)pvals forKeys:(id*)pkeys count:(int)c;
@end
@implementation AAA
+ (id)numberWithInt:(int)v
{
    return  @"AAAAA as number!!!";
}
+ (id)arrayWithObjects:(id*)pobj count:(int)c
{
    return  @"AAAAA as array!!!";
}
+ (id)dictionaryWithObjects:(id*)pvals forKeys:(id*)pkeys count:(int)c
{
    return  @"AAAAA as dictionary!!!";
}
@end



@compatibility_alias NSDictionary AAA;
@compatibility_alias NSArray AAA;
@compatibility_alias NSNumber AAA;



id test()
{
//  return  @{};
//  return  @[];
    return  @55;
}

Result.

2013-03-23 08:54:42.793 return of test = AAAAA!!!
2013-03-23 08:54:42.796 Hello, World!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的 Clang Objective-C 文字可以重定向到自定义类吗? 的相关文章

  • Travis CI 与 Clang 3.4 和 C++11

    Travis CI 是否可以与支持 C 11 的 Clang 一起使用 我想要 Clang 而不是 GCC 我已经在 Travis CI 中使用了 GCC 4 8 看来预安装的版本不支持 C 11 我安装任何新版本的所有尝试都结束了因为这个
  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • Objective-C++ 中的 boost::shared_ptr

    这是对我之前提出的一个问题的更好理解 我有以下 Objective C 对象 interface OCPP MyCppobj cppobj end implementation OCPP OCPP init cppobj new MyCpp
  • 通过应用程序组在应用程序之间通信和保存数据

    iOS 8 昨天发布了一个有关应用程序组的新 API 以前在应用程序之间共享数据和通信有点混乱 我相信这正是应用程序组旨在纠正的问题 在我的应用程序中 我启用了应用程序组并添加了一个新组 但我找不到任何有关如何使用它的文档 文档和 API
  • 如何将数据从一个视图传递到下一个视图?

    我正在制作一个下载排队系统来下载视频 处理下载的排队代码位于另一个视图控制器中 现在我的问题是如何将下载的 URL 传递到另一个视图而不推送到另一个视图控制器 如下所示 ViewConntroller View ViewConntrolle
  • 如何将 CIFilter 输出到相机视图?

    我刚刚开始使用 Objective C 我正在尝试创建一个简单的应用程序 它显示带有模糊效果的相机视图 我得到了与 AVFoundation 框架一起使用的相机输出 现在 我正在尝试连接 Core 图像框架 但不知道如何连接 Apple 文
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • 如何处理 clang 中的全局构造函数警告?

    Clang 警告 当使用 Weverything or Wglobal constructors 关于静态对象的构造函数 warning declaration requires a global constructor Wglobal c
  • 没有关于 bool 到浮点类型的隐式转换的警告?

    看起来这个片段在 clang 中编译时没有警告 即使使用 Weverything 也是如此 double x if fabs x gt 1 0 我错过了什么吗 或者编译器和 C 标准是否认为强制转换bool to double有道理吗 这是
  • 显示器连接或断开连接时的通知

    我正在开发一个 OS X 应用程序 该应用程序在所有连接的显示器的所有可用空间上显示自定义窗口 我可以通过调用 NSScreen Screens 获取可用显示对象的数组 我目前缺少的是一种判断用户是否将显示器连接到系统或从系统断开屏幕的方法
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 断点条件错误

    我已经根据条件设置了断点 event name isEqualToString Some Name 这很好用 但是 当我尝试添加另一个带有条件的断点时 part name isEqualToString Some Value With A
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • AVPlayer 不播放音频 - iOS 9,目标 - C

    我正在尝试从我的应用程序中的 URL 播放音频 iOS 8 中一切都按预期发生 模拟器和物理设备 对于 iOS 9 它可以在模拟器中运行 但在设备上 音频根本无法播放 出现流媒体 如果我单击播放 进度条还显示音频正在加载并播放 但没有声音
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • 使用 Interface Builder 创建的自定义视图在其他视图中调用时不会呈现

    我有一个用于主窗口的 xib 并通过以下步骤创建了一个自定义视图 创建一个新类 继承自NSView MyView h import
  • Objective C 中类别是如何实现的?

    作为一名程序员 我知道如何使用类别 但我很好奇它们是如何实现的 编译器是否将它们编译为对类替换方法 http developer apple com library mac documentation Cocoa Reference Obj
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • LLVM cpp 后端,它会取代 c 后端吗?

    我的问题是关于 CPP 后端 它与 C 后端的用途相同吗 C 后端是我最喜欢的 LLVM 功能之一 我对它被删除感到非常沮丧 真正的区别是什么 我非常感谢任何帮助 参考 LLVM 3 1 发行说明 http llvm org release

随机推荐

  • 使用可变数量参数的动态调用中的受控异常处理

    In a 昨天的话题已解决 https stackoverflow com questions 9726032 puzzle involving unwound stacks on dynamic invoke 9750323 hvd 向我
  • C 中取消引用和括号引用的操作顺序

    If I do ptr x 这相当于 ptr x or ptr x ptr x See the 维基百科运算符优先级表 http en wikipedia org wiki Order of operations Programming l
  • 为 Django 查询强制使用 INNER JOIN

    这是我的架构 城市 gt 摄影师 我正在尝试获取至少拥有一名摄影师的城市列表 并返回这些城市的摄影师数量 这是我正在使用的查询集 City objects annotate photographer count aggregates Cou
  • User.config是如何创建以及如何使用的

    我开始阅读有关配置文件的内容 并阅读有关 user config 的内容 谷歌搜索了一下 但找不到它是如何创建以及如何使用的 另请注意 将为每个用户创建一个单独的 user config 甚至阅读 StackOverflow 中的问题 但它
  • iOS10应用关闭时如何响应本地通知?

    当应用程序完全关闭 不在后台 时如何响应本地通知 当应用程序在后台或前台运行时 一切正常 但是当应用程序关闭并且我试图回复通知时 仅 application didFinishLaunchingWithOptions 被呼叫 userNot
  • python中带注释的双向条形图plotly

    我有一个带有玩具版本的 pandas 数据集 可以用它创建 creating a toy pandas dataframe s1 pd Series dont have a mortgage 31 8 have mortgage 15 65
  • 从 Boost 多索引迭代器获取数字索引

    我正在存储以下一堆内容 struct Article std string title unsigned db id id field in MediaWiki database dump 在 Boost MultiIndex 容器中 定义
  • 如何将图像旁边的文本垂直居中

    无论我做什么 我都无法使镜头在图像旁边垂直居中 有什么想法吗 我已经搜索过但没有结果 任何帮助将不胜感激 谢谢 您可能需要扩大结果窗口才能看到我在说什么 FIDDLE http jsfiddle net mbM7C 4 HTML div c
  • 使用 Twilio 发送群组消息

    有没有办法使用 twilio 向群组线程发送消息 我不希望每个收件人都有一个单独的线程 其中包含发送消息的 twilio 号码 感谢您的任何建议 来自 Twilio 的 Ricky 在这里 您无法按照您所描述的方式进行设置 但我们确实有一篇
  • 如何在 IIS 10 上配置缓存?

    我有一个网站 并且启用了缓存 如下所示 为服务器启用缓存 为我正在测试的网站启用缓存 在响应标头中 我将整个网站的网页内容过期时间设置为 30 天 没有针对任何特定文件夹的设置 为文件 css js png woff2 启用缓存 在 Chr
  • 在 Kotlin 中为 API 级别小于或等于 16 创建 Date 对象

    这听起来可能非常有趣和基本 但我正在努力通过将纪元到它的秒数传递给 Kotlin 来创建 DateTime 类型的对象 我得到的示例要么是需要 API 级别 26 的库 要么只是讨论从 DD MM YYYY 字符串到其他字符串的格式转换 到
  • 使用单元格按钮操作传递多个参数

    NOTE 我不需要任何关于使用 UITableview 的 didselect 委托发送数据的建议 myButton h import
  • 在 UITableView 中保留占位符单元格

    我有一个 UITableView 我永远不想低于 1 个单元格 它是一个目录读数 如果目录中没有文件 它有一个单元格显示 无文件 在编辑模式下 有一个用于创建文件的奖励单元格 因此编辑模式永远不会低于两个单元格 可能只是睡眠不足让我现在无法
  • 避免在 sweave/pgfsweave 编译期间显示数字

    使用 sweave pgfsweave 进行编译时 每次在 R 中创建图形时 它都会显示在图形窗口中 在 sweave 编译过程中 这在许多情况下很有帮助 因为我可以在编译文档时看到图形的样子 但是当我通过 ssh 编译一个大文档时 这可能
  • Marshal.GenerateGuidForType(Type) 和 Type.GUID 有什么区别?

    Type classType typeof SomeClass bool equal Marshal GenerateGuidForType classType classType GUID 我还没有发现不符合这个条件的案例 So 为什么以
  • 从程序内调用 daemon(0,0) 和在后台启动程序并重定向其输出有区别吗

    在程序 progX 开头使用以下代码有什么区别 if daemon 0 0 1 printf daemon error s strerror errno 或通过以下命令运行 progX progX 2 gt dev null 1 gt de
  • 无法加载 C++/CLI DLL 资源

    我只是想查看资源名称 但什么也没有出现 我在 Visual Studio 2010 中制作并编译了一个 C CLI 托管 DLL 并添加了一些资源文件作为测试 一个图标和一个位图 我已经检查过 PE Explorer 资源肯定在那里 我的简
  • Grails - 按域关系属性排序(使用 createCriteria())

    我有两个具有 1 n 关系的域类 import Action class Task Action actionParent String taskName and class Action String actionName 我有一个任务列
  • 如何获取每个 Kotlin 的当前索引

    如何在foreach循环中获取索引 我想打印每第二次迭代的数字 例如 for value in collection if iteration no 2 do something 在java中 我们有传统的for循环 for int i 0
  • 新的 Clang Objective-C 文字可以重定向到自定义类吗?

    虽然超载 开始踏上危险的领域 我喜欢在 Clang 3 1 中添加新的 Objective C 文字 不幸的是 新的文字对我来说用处有限 除了代码需要与 AppKit 交互的情况外 我大多放弃使用基础类 转而使用我自己的自定义框架 出于多种