可以在新锵Objective-C的文字被重定向到自定义类?可以在新锵Objective-C的文字被重

2019-06-14 09:37发布

虽然超载@开始踩在危险地带,我爱除了在Clang的3.1新的Objective-C的文字的。 不幸的是,新的文字是利用有限的给我的。 除了其中的代码需要与AppKit的接口的情况下,我大部分放弃了使用基础类的有利于自己的自定义框架(用于多种原因,其中大部分是我需要在使用的内存分配模式直接控制通过对象)。

我总是用一些运行时弄虚作假新创建的对象冒充我的自定义类(是我已经做字符串对象常量,因为只有非苹果GCC运行支持-fconstantstring=class标志),但这是一个黑客在最好的抛出了我获得了通过更换等价类基金会开始与所有利益。

不像字符串对象文字,新文字锵工具实际上不是恒定的类(其中存储器布局被硬编码); 代替相应的消息被发送到它们各自的类来创建并在运行时初始化一个新的对象。 效果并不比如果你已经自己创建的对象不同。 理论上这意味着使用的类和新的文字调用的方法都没有硬编码。 在实践中我找不到任何办法改变他们指向自己的自定义类和方法(我其实很高兴只是指向自定义类;指向一个虚拟方法在运行时实际的方法并不难)。

当我第一次看到这个,我真的很希望能找到一套可以用来做我问什么标志,但我还没有发现任何,我希望有人有一个解决方案。

Answer 1:

您可以为一些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;

现在锵会为你做这项工作。 我证实了这是工作数量,数组,字典文字。 不幸的是字符串文字似乎被静态地发射,所以它不会工作。

有关更多信息@compatibility_alias关键词, 在这里看到 。

注意

由于@compatibility_alias关键字是适用于当前编译单元一个编译器指令,你需要单独的编译单元,以避免与苹果公司的基础套件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;
}

结果。

2013-03-23 08:54:42.793 return of test = AAAAA!!!
2013-03-23 08:54:42.796 Hello, World!


Answer 2:

该意见有它正确的,但只是为了总结:

  • 没有。

苹果的含义@{} @[]@""文字是硬编码到锵。 你可以在这里看到: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/NSAPI.cpp?view=markup这一切都相当模块化的,这意味着它不会为一个硬Clang的黑客添加自己的文字语法......但“模块化”并不意味着“从外部访问”。 添加一个新的语法,甚至重定向现有的语法来新课程肯定会需要你自己重建锵。

这里有一个博客帖子大约增加NSURL由黑客在其内部文字到锵: http://www.stuartcarnie.com/2012/06/llvm-clang-hacking-part-3.html (感谢@Josh的Caswell)


如果你愿意使用的Objective-C ++与C ++ 11的扩展,你可以有“用户定义的文字”,它允许你写的东西像

NSURL *operator ""URL (const char *s) { return [NSURL URLWithString: @(s)]; }

int main() {
    ...
    NSURL *myurl = "ftp://foo"URL;
    ...
}

这是在迈克·阿什的博客的评论中提到。 http://www.mikeash.com/pyblog/friday-qa-2012-06-22-objective-c-literals.html但这并不看起来非常的Objective-C-ISH(或非常C ++ ISH!) ,它仅适用于一个Objective-C ++编译器11,一般请不要这样做。 :)



文章来源: Can the new Clang Objective-C literals be redirected to custom classes?