以下是来自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
是否同时充当吸气剂和制定者?
答案 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;
这意味着dataSource
是id
(即指向对象的指针),它实现了APLSimpleStockViewDataSource
协议。此外,它被标记为插座,以便您可以在Interface Builder中进行设置。因此,self.dataSource
返回引用视图数据源的id
(同样是一个对象指针)。
“self.dataSource在这里充当getter和setter吗?
不,它只是一个返回数据源对象的getter。