关于Objective-C中的协议

时间:2013-01-07 17:35:22

标签: objective-c protocols

我对OBJ-C中的协议有一些疑问。 我经常看到用协议声明id对象的行,例如:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    id  <NSFetchedResultsSectionInfo> secInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
    NSLog(@"%i",[secInfo numberOfObjects]);
    return [secInfo numberOfObjects];
}

我根本不理解以下几行:

id  <NSFetchedResultsSectionInfo> secInfo = [[self.fetchedResultsController sections]objectAtIndex:section];
  1. “id”是什么意思?
  2. “objectAtIndex:section”返回什么对象?
  3. 为什么我可以在对象上调用“[secInfo numberOfObjects]”? 我的意思是,方法numberOfObjects是如何存在的?
  4. 我正在尝试使用CoreData,但如果不理解这一点,我实际上无法继续。 谢谢。

5 个答案:

答案 0 :(得分:3)

  

id <ProtocolName>是什么意思?

它表示“指向该类实现ProtocolName协议的任何Objective-C对象的指针”。

  

objectAtIndex:section返回什么对象?

它返回符合<NSFetchedResultsSectionInfo>协议的任何类的对象。

  

为什么我可以在对象上调用[secInfo numberOfObjects]

为什么不呢?

  

我的意思是,方法numberOfObjects是如何存在的?

返回的对象的类实现它。

答案 1 :(得分:2)

如果您有Java背景,请将NSFetchedResultsSectionInfo视为Java接口而不是具体类,并且函数内容如下所示:

NSFetchedResultsSectionInfo secInfo = this.fetchedResultsController.sections().objectAtIndex(section); 
System.out.println(secInfo.numberOfObjects());
return secInfo.numberOfObjects();
可以在numberOfObjects上调用

id <NSFetchedResultsSectionInfo> secInfo,因为这是在Objective-C中声明此类事物的等效方式 - 它不是特定的类,而是“接口”。

答案 2 :(得分:1)

  1. id表示“任何类型的对象”。 id <NSFetchedResultsSectionInfo>表示“任何类型的对象,只要它实现NSFetchedResultsSectionInfo协议。协议只是方法签名列表,如果对象实现协议,则意味着具有实现该协议的所有必需方法。

  2. 你真的不在乎。它可以是任何实现NSFetchedResultsSectionInfo协议的对象,但您并不关心它是什么类型的对象。您需要知道的是,您可以通过NSFetchedResultsSectionInfo协议向其发送任何所需的消息。

  3. secInfo是实现NSFetchedResultsSectionInfo协议的对象。如果你去查看协议(cmd +点击相同会将你带到它的定义),你会看到列表中有一条名为numberOfObjects的消息。这意味着可以保证实现此协议的任何对象都已实现numberOfObjects

答案 3 :(得分:1)

  1. id是指向任何Objective-C对象的指针的泛型类型。声明类型为id的变量意味着它可以引用任何对象;声明类型id <SomeProtocol>的变量意味着它可以引用任何类的对象,但它必须符合SomeProtocol

  2. [self.fetchedResultsController sections]返回一个数组,其中每个元素都是一个对象(其类未知),它实现了NSFetchedResultsSectionInfo协议并表示了表中的一个部分。您正在实现的方法想知道索引作为section参数传入的节中的行数,因此您在该数组上调用objectAtIndex:section以获取id <NSFetchedResultsSectionInfo>对象代表该部分。

  3. 您可以调用[secInfo numberOfObjects],因为您已声明secInfo引用实现NSFetchedResultsSectionInfo协议的对象; numberOfObjects是该协议中的一种方法。 (它实际上是有效的,因为在运行时,它实际上是一个实现该协议的对象,正如-[NSFetchedResultsController sections]记录的行为所预期的那样。)

  4.   

    我正在尝试使用CoreData,但如果不理解这一点,我实际上无法继续。

    协议不仅仅是核心数据的东西;如果你遇到问题我建议你阅读Objective-C language documentation

答案 4 :(得分:0)

  

“id”是什么意思?

id<NSFetchedResultsSectionInfo>用于保证对象符合NSFetchedResultsSectionInfo,因此如果不符合,则会收到编译器警告。它对此很有用。

  

“objectAtIndex:section”返回什么对象?

id是指向对象的所有指针的根。

当不确定返回的对象是否为某种类型时,通常会使用id。唯一已知的是它符合NSFetchedResultsSectionInfo协议。所以情况就是这样:你不知道将返回哪种类型的对象,只是它符合该协议。

  

为什么我可以在对象上调用“[secInfo numberOfObjects]”?我的意思是,方法numberOfObjects是如何存在的?

只需查看文档,它就是由班级实现的。