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