0

你们能帮我快速理解一个概念吗,我无法理解从 C 到 Objective-C 的转换:

如果我有一个看起来像这样的特定实例方法:

-(void)addOwnerNamesObject:(NSString *)n; 
{
    // ownerNames defined as NSMutableSet
    [ownerNames addObject:n];
}

我明白了几件事...

  1. 它是一个可以被程序调用的实例方法。
  2. 在 C 中,这不会返回任何内容(只需执行卷曲中的代码)
  3. 在 C 中,语法稍微不那么令人困惑 -(void)InstanceMethod(Char *nameOfArgument)

这是我需要帮助的地方:

  1. 当你调用这个方法时,你还在给它发送一个参数吗?
  2. 如果是这样,该参数是NSString方法名称的实例n吗?

最后……跑题了

如果你有方法...

-(id)someMethod:(NSString *)pn
{
}
  1. (id) 是干什么用的?这是否告诉编译器它可以返回任何类型的对象?

感谢您帮助新手...非常感谢。

4

4 回答 4

5

首先,您应该真正看一下基本的 Objective-C 文档

在 Objective-C 中,方法前面可以有一个+-符号。

+用于类方法,-用于实例方法。

然后你有返回类型、括号内和方法名称。

- ( int )foo;

一个名为 的实例方法foo,返回一个int.

类似的 C 函数将是:

int foo( void );

在 Objective-C 中,当你有参数时,方法名有点特殊。

例如:

- ( int )foo: ( double )num;

一个名为 的成员方法foo:,返回一个int并接受一个double名为 的参数num

类似的 C 函数:

int foo( double num );

现在有多个参数:

- ( int )foo: ( double )num1 bar: ( float )num2;

一个名为 的成员方法foo:bar:,返回一个int并接受一个double名为 的参数num1和一个名为 的float参数num2

类似的 C 函数:

int foo( double num1, float num2 );

关于您的问题id,它只是方法返回类型。

id是用于 Objective-C 实例的 typedef。
基本上,它是一个void *.

id确实代表任何类的Objective-C对象指针。

于 2012-02-09T15:47:27.777 回答
1

首先,方法名称中的破折号 (-) 表示这是一个实例方法,这意味着您需要一个实例来发送此消息。调用看起来像这样:

NSString* s = @"一个字符串"; [someInstance addOwnersNameObject:s];

在这种情况下,您将 NSString 实例s传递给 addOwnersNameObject 消息。

id就像C 中的void * 。

于 2012-02-09T15:49:41.770 回答
1

你已经知道你在说什么了。

1.) 当你调用这个方法时,你还在给它发送一个参数吗?

是的,冒号后面是什么

添加多个冒号以传递其他参数...

-(void)addOwnerNamesObject:(NSString *)n withSomeIntYouWantToPass:(int)value;

2.) 如果是这样,该参数是否是方法名称为“n”的 NSString 实例?

是的

3.) (id) 是干什么用的?这是否告诉编译器它可以返回任何类型的对象?

是的,您将返回一个 NSObject 或 NSObject 的子类

于 2012-02-09T15:52:01.397 回答
1

添加到已经给出的那些非常有效的答案,并进一步讨论id

Objective-C 中的对象是无类型的,这意味着从根本上讲,您不需要知道类型就可以与对象对话。这是 Objective-C 和 C++ 之间的最大区别之一。

指向对象的指针通常是有类型的,例如NSString *使代码更具可读性并向编译器表明您的意图,以便在您做任何奇怪的事情时它可以提供适当的警告。

id是指向对象的无类型指针。任何对象类型都可以作为传递,id并且任何id值都可以分配给任何对象指针,而无需强制转换。

99.99% 的时间,id可以替换为NSObject *99.99% 的对象继承自NSObject,这意味着您可以使用继承的事实而不是无类型对象的事实来一般地传递​​事物。然而NSObject,它既是一个对象又是一个协议有点特别,有些对象实际上并不是它的子类NSObject——NSProxy代表块的类会立即浮现在脑海中。您很少会对这些特殊情况特别感兴趣,id但通常将其用作约定,因为人们更喜欢传递没有指示其类型的对象的语义,而不是传递具有已知祖先的对象。

于 2012-02-09T15:58:34.657 回答