Objective c 目标C类型作为参数

Objective c 目标C类型作为参数,objective-c,Objective C,好的,我不是问调用方法或其他东西时如何获取参数 我想要这样的东西: -(void)doSomethingWithType:(TYPE)type { //do something } [self doSomethingWithType:int]; 执行如下: -(void)doSomethingWithType:(TYPE)type { //do something } [self doSomethingWithType:int]; 或 如何生成类型为参数的方法/函数的参数?我指的

好的,我不是问调用方法或其他东西时如何获取参数

我想要这样的东西:

-(void)doSomethingWithType:(TYPE)type {

//do something

}
[self doSomethingWithType:int];
执行如下:

-(void)doSomethingWithType:(TYPE)type {

//do something

}
[self doSomethingWithType:int];

如何生成类型为参数的方法/函数的参数?我指的是任何类型……)

我不想做一个int参数,我想做一个int类型的参数,在这里你把目标c类型写为参数,而不是一个值或变量:)

谢谢

类型不在C或Objective-C中,因此不能将它们传递给函数

Objective-C代码通常将它们表示为带有类似于
@encode
字符*
。例如:

- (void)doSomethingWithType:(char *)encodedType {
    NSLog(@"Got type %s", encodedType);
}

[self doSomethingWithType:@encode(int)];
#define MY_MACRO(SYMBOL, TYPE) DoSomething(#SYMBOL, (TYPE *)&SYMBOL)
您可以在中查看
@encode
的功能

另一种方法是使用宏(而不是方法),它可以将任意源文本作为参数来创建新代码。例如:

- (void)doSomethingWithType:(char *)encodedType {
    NSLog(@"Got type %s", encodedType);
}

[self doSomethingWithType:@encode(int)];
#define MY_MACRO(SYMBOL, TYPE) DoSomething(#SYMBOL, (TYPE *)&SYMBOL)
您会使用以下选项:

MY_MACRO(foo, int);
这相当于代码:

DoSomething("foo", (int *)&foo);
宏中的“#”前的符号表示“从中生成字符串”。请注意,在编写宏时有很多陷阱;我强烈建议你先在谷歌上搜索一本好的入门书

  • Apple框架通常使用
    @encode
    。apple定义的格式甚至可以描述基本类型的数组。专业-相当标准。缺点-您必须在调用方法之前添加编码类型的代码,并在方法中添加解码

  • 对于您需要的每种类型都有一个单独的方法。缺点-很多方法。优点-易于阅读的代码,易于使用的代码

  • 宏而不是方法。宏可以接受任何参数,包括类型名。缺点-代码难读,优点-代码短,易于使用的代码


  • 然而,没有一个解决方案是完美的。如果您需要这样的东西,在大多数情况下,它只是由非常糟糕的设计造成的。

    我不确定我是否正确理解您的意图,但Objective-C有一个类“class”

    你可以这样称呼它:

    [objectOfMyClass doSomethingWithType: [SomeObjectiveCType class]];
    
    但是,它不适用于基本类型。我的意思是BOOL,int,float,等等,仅仅是Objective-C类。
    希望它能有所帮助。如果这不是您想要的,很抱歉。

    我怀疑这对于非类类型是否可行。Objective-C是C,像
    int
    这样的类型没有任何运行时表示。类型只是编译器(解析器?)遵循和理解代码的一个概念。与Objective-C中实际上是对象的类不同,我怀疑本机变量类型在编译器之外是否有任何意义。提供更多关于您试图对该类型执行的操作的详细信息可能会有所帮助,这样人们就可以对您如何实现这一点提出其他建议。是的,如果您查看我在最后链接的文档,您将看到
    “i”
    对应于
    int
    。您只想将类型的名称作为字符串吗?我想使用该类型。就像我有这样的代码:MSHookFunction(((TYPE*)MSFindSymbol(NULL,“SYMBOL”),(TYPE*)$SYMBOL,(TYPE**)和old_uusymbol);如果我对几个符号和类型这样做的话,会有大量的代码重复,因此我想要一个函数,将类型作为参数,在代码中使用它。所以我不必检查类型,只需在函数中使用代码一次,然后调用函数,如startSomething(int,“SYMBOL”)@xCoder我添加了另一个建议。我已经尝试过这个方法,效果非常好!:)谢谢@Free昵称!但是内存问题呢?在通过课程类型时,是否有任何特殊考虑?我问这个问题是因为xCode提示使用
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu unrepaired Class
    @KiNG,很高兴我能帮上忙:)至于你的问题,请看。那里有一个小对话。它甚至有一个:)重写它对于评论来说有点太长了,但很快:没什么好担心的:)谢谢@freein昵称:)我是一名C#和以前的Delphi开发人员,老实说,我对Objective-C中的内存管理系统和所有那些弱小和强大的东西都不太满意!:p@KiNG,也谢谢:)直到你问我时我才知道:)我不知道你是否读过这篇文章,但手动内存管理在本文中有很好的描述:。我认为了解基本知识是很好的,即使ARC现在统治着这片土地。顺便说一句,@KiNG,这些手册相当简短,解释了内存管理的原则和惯例。这是关于Core基金会的。但我不知道它是否是最新的。我还没有与ARC的CoreFoundation合作过。