Objective-C协议语法

时间:2013-05-23 19:32:12

标签: objective-c syntax protocols

以下是来自Apple自己的SimpleStocks示例代码(APLSimpleStockView.m)的两行代码

NSInteger dataCount = [self.dataSource graphViewDailyTradeInfoCount:self];
NSArray *sortedMonths = [self.dataSource graphViewSortedMonths:self];

上面的第一个代码行看起来像“dataSource”是邮件graphViewDailyTradeInfoCount:self的收件人(返回NSInteger)。

上面的第二行代码看起来像“dataSource”现在是消息graphViewSortedMonths:self的接收者(返回NSArray *)。

我可以找到的唯一对dataSource的引用(在APLSimpleStockView.h中)它是一个属性,而不是一个对象/类实例?为什么我可以向房产发送消息?我以为我只能得到并设定一个房产的价值?

代码的最终结果是在第1行之后,dataCount包含一个数字,在第2行之后,sortedMonths包含一个已排序的月份名称数组。但是这种行为来自何处,因为我无法在示例中找到dataSource导致发送消息时返回任何内容的任何位置。

此处self.dataSource是否同时充当吸气剂和制定者?

2 个答案:

答案 0 :(得分:3)

  

我以为我只能获得并设置一个属性的值?

这是正确的,但财产的价值是多少?在这种情况下,它是一个对象,您绝对可以向对象发送消息。

代码相当于使用属性的getter,将结果赋值给变量,然后发送消息:

WhateverClassTheDataSourceIs * dS = self.dataSource;
NSInteger dataCount = [dS graphViewDailyTradeInfoCount:self];

不需要额外的作业。

(您的代码也可以写成

[[self dataSource] graphViewDailyTradeInfoCount:self]; 

如果这样可以让你更清楚。)

答案 1 :(得分:0)

  

为什么我可以向房产发送消息?

属性只是为给定名称提供访问器方法的承诺。如果属性为foo,则访问者通常为-foo-setFoo:。因此,在这种情况下,self.dataSource返回一个接收消息的对象。

如果查看APLSimpleStockView接口,您将看到声明为对象指针的属性:

@property (nonatomic, weak) IBOutlet id<APLSimpleStockViewDataSource> dataSource;

这意味着dataSourceid(即指向对象的指针),它实现了APLSimpleStockViewDataSource协议。此外,它被标记为插座,以便您可以在Interface Builder中进行设置。因此,self.dataSource返回引用视图数据源的id(同样是一个对象指针)。

  

“self.dataSource在这里充当getter和setter吗?

不,它只是一个返回数据源对象的getter。