关于方法的基本Obj-C问题

时间:2010-01-10 04:15:03

标签: objective-c methods

举例:

-(void)setName:(NSString *)name age:(int)age;

你如何调用这个方法(换句话说,方法的名称是setName,但是那里的“age”参数是什么)括号中的类型是什么意思?它只是一种告诉编译器返回什么类型的方法吗?

6 个答案:

答案 0 :(得分:3)

[ myObject setName: @"Adam" age:18 ];

age参数是方法签名中的第二个参数。

括号中的类型是参数的预期类型。例如name只期待NSStringage只期待int

-表示该方法是实例方法,而不是类方法,而是使用+表示。

-之后的括号中的类型是返回类型。

这是学习Objective-C基础知识的绝佳网站:CocoaDevCentral

答案 1 :(得分:1)

这是标准的Objective-C方法语法。这可以理解为:

  

没有返回值(void)的方法   设置对象的名称(NSString *参数)   和年龄(和整数   参数)。

解剖方法:

  • “ - ”连字符表示这是一种实例方法。

  • (void)返回类型为void - 或 没有预期的退货类型

  • setName:(NSString *)第一个 要传递的参数是“名称” 并且是一个NSString *。

  • age:(int)age第二个参数 要通过的是“年龄”而且是 一个int。

实际上,一旦理解了方法语法实际上是非常自我记录的(如果你习惯了更传统的C / C ++或Java语法,那么它就非常陌生)。

此方法调用的实际示例如下:

[someObject setName:@"Rich" age:101];

答案 2 :(得分:1)

要回答,人们需要更多的信息,但我猜这是来自某种名为aClass的类,你有一个aClass的实例,名为instance。

-(void)setName:(NSString *)name age:(int)age;

表示你有一个名为setName:age:的方法,它需要两个参数,一个NSString,一个int,它返回一个void。因为它是 - 作为它的第一个字符,它是一个实例方法。

[instance setName:@"James Hargrove" age:21];

将在实例上调用setName:age:。

(应该使用

创建实例
aClass *instance = [[aClass alloc] init];

将创建一个aClass命名实例的实例,并初始化它。

答案 3 :(得分:1)

方法名称实际上是这样的:

setName:age:

你这样称呼它:

[someObject setName:@"Alice" age:20];

setName:age:也是该方法的唯一签名,使用该签名,您可以在任何对象上调用该方法。例如:

NSArray* objects = ...

SEL mySelector = @selector(setName:age:);
for (id object in objects)
{
    if ([object respondsToSelector:mySelector])
    {
        [object setName:@"Alice" age:20];
    }
}
  

括号中的类型是什么意思?它只是一种告诉编译器返回什么类型的方法吗?

是的,那些是“C演员”。如果一切都是一个对象,你就不需要那些,但是因为你可以传递和返回普通的旧C类型,所以编译器需要知道你的参数类型和返回值。

答案 4 :(得分:0)

你可以这样称呼这个方法:

[classInstance setName:@"name" age:123];

“age:”的第一个实例表示该方法在方法实现中使用时会接收另一个名为“age”的参数。

括号中的类型表示每个参数所需的数据类型,第一个参数除外,“void”,这意味着此方法不返回任何内容。

答案 5 :(得分:0)

因此,您可以按如下方式调用此方法。

假设它是一个名为foo(类Foo)的对象的方法。然后你会打电话:

[foo setName:someName age:someAge].

如果它是静态方法,则前面会加一个+而不是一个减号,如下所示:

+(void)setName:(NSString *)name age:(int)age;

然后你会打电话给

[Foo setName:someName age:someAge] //use the classname instead of the object name

这些类型确实存在于编译器进行类型检查。如果传递错误的数据类型,您将收到警告,如果您的标题与您的实现不符,您将收到警告。

你可以用几种不同的风格编写Obj-C函数,省略一些这些东西。你甚至可以直接写C风格。