English 中文(简体)
何时在iOS中使用懒惰的即时操作?
原标题:When to use lazy instantiation in iOS?

我听说过在iOS中懒惰地即时操作物体是相当常见的,但我不确定我何时该使用它? 有人能简要解释一下我何时应该使用懒惰即时操作,以及我何时应该刚刚开始使用Init方法的属性吗?

我对懒惰的即时反应的担心是 它需要很多代码(而只是用输入法写下来) 特别是如果你有多个特性需要初始化的话。

最佳回答

详细解释我的评论。有时,如果你有一个只需要配置一次的物体, 并且有些组合, 你不想混淆你的内脏方法, 这个技巧是好的。

- (UIView *)myRoundedView;
{
    if (!_myRoundedView) {
        _myRoundedView = [[UIView alloc] initWithFrame:<#some frame#>];
        _myRoundedView.layer.cornerRadius = 10.f;
        _myRoundedView.backgroundColor    = [UIColor colorWithWhite:0.f alpha:0.6f];
        _myRoundedView.autoresizingMask   = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    }
    return _myRoundedView;
}

这是一个相当巧妙的例子, 但你可以开始看到它的优点。 方法应该像类一样, 并且做一件好事。 这个方法恰好是返回我想要的圆形视图。 如果我把这个代码放入输入法中, 那么开始法现在必须知道 如何即时化和配置这个视图以及我在那里扇过的其他对象的微小微小细节 。

问题回答

It is good in situations where you have objects that can have a big memory footprint, so you can avoid to initialize all these expensive objects at the moment of the container class initialization. Lazy initialization can preserve memory consumption in several situations ...

然而,如果所有物体在集装箱物体初始化之后或紧接着集装箱物体初始化之后需要初始化,则懒惰初始化显然没有任何意义,应当使用标准建造装置初始化。

lazy 初始化应用于您在某个类别中有非选对象, 在所有类工作流程中都无法初始化 。

与任何技术一样,没有一条单一的、一刀切的规则可以告诉您何时懒惰地即时处理某事。 我认为明智的忠告是用懒惰的即时处理那些费用昂贵的即时处理的东西。 如果需要做很多磁盘或网络访问,或者花费大量CPU时间来安装,你最好还是推迟这项工作,直到实际需要(或者在背景中这样做 ) 。 特别是对于用户可能使用或不使用的特点,在“编码-init (或类似)”中设置很多时间是没有意义的,这样做可以使用户觉得你的申请很迟钝。

这样的话,你应该避免过早优化。 不要花太多时间撰写复杂的代码来帮助表现,直到你做了明显的事情,发现性能问题,并描述你的代码来彻底理解问题。完成后,你就可以开始修改来改进事情。

不仅对于记忆和性能, 看看这个,这里还有一个例子:

- (NSArray *)validElements{
    if (!_validElements) {
        _validElements = [[NSArray alloc] initWithObjects:
                          @"mystuff",@"generaldescription",@"title",@"autor",
                          @"version",@"date",@"context",@"operatingsystem",@"kindofdevice",
                          @"deviceversion",@"rule",@"daytime",@"time",@"location",@"deviceheading",
                          @"region",@"language",nil];
    }
    return _validElements;
}

You can use lazy instantiation for doing a custom init or special configuration and yes also this benefits memory and performance.





相关问题
List Contents of Directory in a UITableView

I am trying to list the contents of Ringtones directory in a TableView, however, I am only getting the last file in the directory in ALL cells, instead of file per cell. This is my code: - (...

iPhone NSUserDefaults persistance difficulty

In my app i have a bunch of data i store in the NSUserdefaults. This information consists of an NSObject (Object1) with NSStrings and NSNumbers and also 2 instances of yet another object (Object2). ...

Writing a masked image to disk as a PNG file

Basically I m downloading images off of a webserver and then caching them to the disk, but before I do so I want to mask them. I m using the masking code everyone seems to point at which can be found ...

Resize UIImage with aspect ratio?

I m using this code to resize an image on the iPhone: CGRect screenRect = CGRectMake(0, 0, 320.0, 480.0); UIGraphicsBeginImageContext(screenRect.size); [value drawInRect:screenRect blendMode:...

Allowing interaction with a UIView under another UIView

Is there a simple way of allowing interaction with a button in a UIView that lies under another UIView - where there are no actual objects from the top UIView on top of the button? For instance, ...