虽然@
的重载开始踏上危险的领域,但我喜欢在CLAN 3.1中添加新的Objy-C文字。不幸的是,新的文字对我来说是有限的。除了代码需要与AppKit接口的实例之外,我基本上放弃了使用基础类来支持我自己的自定义框架(由于各种各样的原因,其中大部分是我需要对对象使用的内存分配模式进行直接控制)。
我总是可以使用一些运行时的诡计来将新创建的对象作为自定义类传递(这也是我必须处理的字符串对象文字,因为只有非苹果GCC运行时支持-fconstantstring=class
标志),但这是一个最好的解决方案,并且通过替换等价的基础类来抛出我获得的所有好处。
与字符串对象文字不同,新的文本CLAN实现实际上不是常数类(其中内存布局是硬编码的);相反,适当的消息被发送到它们各自的类,以便在运行时创建和初始化新对象。效果与您自己创建对象的效果一样。理论上,这意味着所使用的类和新文本调用的方法不是硬编码的。在实践中,我找不到任何方法来改变它们来指向我自己的自定义类和方法(实际上,我只需指出一个自定义类就很高兴;在运行时把一个哑方法指向一个实际的方法并不困难)。
当我第一次调查这件事时,我真的希望能找到一组可以用来做我所要求的事情的旗子,但由于我还没有找到,我希望有人能找到解决办法。
最佳答案
您可以用“cc>关键字技巧”替换一些Objy-C文字。
这里有一个例子。
@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
关键字,see here的详细信息。注意
因为
@compatibility_alias
keyword是一个适用于当前编译单元的编译器指令,所以您需要分离编译单元,以避免与apple的foundation kit中的nsobject类重复符号。我就是这样做的。主要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;
}
测试.h
id 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!
关于objective-c - 是否可以将新的Clang Objective-C文字重定向到自定义类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11252392/