(只是为了让你现在,我正在学习为iPhone开发一本名为Beginning iPhone 3开发的书:探索SDK,我不使用Interface builder) 私有成员可见时,是否有理由在同一个类中使用getter?就像在Foo.h中一样,
NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;
然后在Foo.m中,使用self.myObj(或[self myObj])访问成员 myObj ?因为在我的书中,这是它告诉你在其中一个应用程序中写的内容(它检查UIViewController成员的视图是否在superview中):
if(self.yellowViewController.view.superview == nil) {
(注意自我 .yellowViewController ......) 这有什么原因吗?如果我没有一个想法可能是因为成员blueViewController是BlueViewController类,所以我认为如果没有理由它可能不会引起混淆。那么在任何时候需要在同一个类中使用getter吗?
谢谢!
答案 0 :(得分:2)
延迟加载getter:
- (UIImageView*) getImageView
{
if (!imageView)
{
imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
}
return imageView;
}
根据imageView的定义方式(复制,分配,保留),您需要修改实际的赋值,但这就是延迟加载的含义。
答案 1 :(得分:1)
是的,通过吸气剂直接访问您的ivars是一件好事。
作为一个例子:Cocoa中的一个正常的设计模式(特别是在电话上,资源非常有限)被称为延迟加载。
总结一下,这意味着在您需要之前不要加载资源。
理想情况下,您可能希望在getter中放置代码,以检查是否加载了请求的资源,如果没有,则加载它。直接访问ivar只会返回nil。另一种方法是在初始化父类时初始化所有的ivars,从而可能浪费资源来存储可能需要或可能不需要的数据。
这也允许您潜在地放置可能在applicationDidReceiveMemoryWarning:
方法中再次检索的资源,并在资源紧张时将其转储,因为它们将在需要时根据需要再次加载。
答案 2 :(得分:1)
使用self.ivar
getter语法而不是直接访问实例变量的几个原因: