1

以下是 Apple 自己的 SimpleStocks 示例代码中的 2 行代码 ( 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在这里充当吸气剂和二传手吗?

4

2 回答 2

3

我以为我只能获取和设置属性的值?

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

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

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

额外的分配是没有必要的。

(你的代码也可以写成

[[self dataSource] graphViewDailyTradeInfoCount:self]; 

如果这让你更清楚。)

于 2013-05-23T19:36:21.640 回答
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。

于 2013-05-23T19:41:26.170 回答