SimpleStocks协议使用(Apple示例代码)

时间:2013-05-24 17:17:33

标签: objective-c syntax protocols

在Apple提供的SimpleStocks示例代码中,dataSource的定义如下:

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

然后使用如下(仅2个示例,但代码中有更多)

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

我理解graphViewDailyTradeInfoCount的作用,以及graphViewSortedMonths.I我会理解:NSInteger dataCount = [APLStockViewController graphViewDailyTradeInfoCount:self];(尝试过,我想我知道为什么不起作用)

这就是问题:我读取第一行代码的方式,dataSource正在发送消息graphViewDailyTradeInfoCount(它返回一些指定发生了多少事务的数值)。如果我们假设25个交易,基本上是[dataSource 25]; 而现在我的思绪令人难以置信,因为我强烈期待某个地方,会有代码告诉dataSource如何处理正在发送的数据。但是没有!!!

然后令人难以置信的增加了一个数量级:dataSource已经发送了25,它现在返回并将其放入dataCount。它是如何知道的那样,在任何地方我都找不到代码。

现在,让我弹跳,在第二行代码中,dataSource知道接受(然后返回)一个NSArray。

在我日益稀有的理智时刻,我认为dataSource除了“传递”它所传递的东西之外什么都不做。计算机不能做魔术,感觉就像一个功能,但它在哪里记录?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

这是一个问题:我读取第一行代码的方式,dataSource正在发送消息graphViewDailyTradeInfoCount(返回一些指定发生了多少事务的数值)。

正确。

  

如果我们假设25个交易,主要是[dataSource 25];

不正确(基于[]和您的描述,您认为我们正在向数据源发送25)。 通话结束后,dataCount = 25

调用是要求数据源将数据返回给我们。它将自己传递给数据源(:self)以供参考,但请求的目的是从数据源获取信息。

现在我们有25个(存储在dataCount中)我们可以用它做点什么。

同样,在第二行代码中,数据源只是返回数组。我们没有将它传递给数组。

对于之前的迷你问题:

  

NSInteger dataCount = [APLStockViewController graphViewDailyTradeInfoCount:self];

这不起作用,因为APLStockViewController是一个类。我们需要与类的实例(self.dataSource进来的地方)进行对话。

答案 1 :(得分:0)

我认为您可能会过度复制委托和数据源的工作方式。 Datasource指向某个对象的某个实例。

当某个对象表示它是APLSimpleStockViewDataSource时,它说它实现了一些方法,包括graphViewDailyTradeInfoCount:graphViewSortedMonths:。该对象在其创建的某个位置具有SomeInstanceOfAPLSimpleStockView.datasource = self(或者您正在处理的类的名称),例如initviewdidload

就像你有一些一样 实现这些方法的MyObject* myobj,您调用了[myobj graphViewSortedMonths:self