【问题标题】:Lazy initialization not working iPhone延迟初始化不工作 iPhone
【发布时间】:2012-07-09 00:41:05
【问题描述】:

所以我有很多自定义对象,其中可能包含大量数据,或者根据用户输入的数据非常少。如果只需要一点点,我显然不想为大量数据创建存储。所以我听说了初始化,这听起来正是我想要的;我只是无法让它工作。这是我尝试的一个例子:

@synthesize name;

...

- (NSString *)name {
    if (!name) name = [[NSString alloc] init];
    return name;
}

然后在其他地方

myObject.name = localName;

如果我在其初始化程序中使用allocinit myObject 的名称,那么这可以正常工作。但是,当我尝试上面的惰性初始化时,对象的名称在尝试设置后变为nil。我做错了什么?

【问题讨论】:

  • ARC 开启了吗?这是针对 iOS 5/4 的,还是手动引用计数?
  • 是的 ARC 已开启,适用于 iOS 5

标签: objective-c lazy-loading lazy-initialization


【解决方案1】:
@property (strong) NSString *name;

@synthesize name = _name;

- (NSString *)name {
    if (!_name) {
        _name = [[NSString alloc] init];
        ...
    }
    return _name;
}

【讨论】:

  • 我是使用它而不是我的 getter,还是需要同时实现这两者?
  • @Garrett,您可以在需要时通过 self.name 访问它
  • 这在功能上与 OP 在问题中的内容没有什么不同——如果没有指定变量名称,@synthesize 会使用与属性相同的名称创建它。你能解释一下为什么你认为这会有所帮助吗?
  • @JoshCaswell 这正是我写它时的想法,这就是为什么我在问问题之前没有尝试它的原因。但是由于某些原因,这有效,而我的代码无效。
  • 既然你提到了,我不确定。我读了这个问题,读到他没有工作,所以我输入了我一直使用的实现。它似乎适用于 OP,所以要么有一些我们都没有看到的东西,要么还有其他东西。我想也许 OP 没有使用 self.name 访问器方法,也许只是使用了 'name'
猜你喜欢
  • 2020-05-10
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2020-10-08
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
相关资源
最近更新 更多