【问题标题】:Is there a way to do lazy initialization of a atomic property without having to write setter and getter by hand?有没有一种方法可以对原子属性进行延迟初始化,而无需手动编写 setter 和 getter?
【发布时间】:2011-12-08 17:10:10
【问题描述】:

显然在覆盖原子属性访问器时不能使用@synthesize。 Xcode 4 will produce a warning.

现在,是否有另一种方法可以使用延迟初始化原子属性,同时仍然让 Xcode 自动合成 getter 和 setter,而不覆盖其中任何一个?

【问题讨论】:

    标签: iphone objective-c ios ipad xcode4


    【解决方案1】:

    您需要做的是同时编写setter 和getter。您仍然可以@synthesize 获取存储空间。例如:

    //.h
    @property (strong) id x;
    
    //.m
    
    @synthesize x = _x;
    - (id)x
    {
        @synchronized(self)
        {
            if (!_x)
            {
                _x = [[MyX alloc] init];
            }
            return _x;
        }
    }
    
    - (void)setX:(id)x
    {
        @synchronized(self)
        {
            _x = x;
        }
    }
    

    您可能需要在不使用 ARC 的情况下进行额外的内存管理,并且可能想要创建不同的锁(而不是 self)或使用不同的同步方法,但它会为您提供要点。

    【讨论】:

    • 为什么建议创建一个不同的锁而不是自己?有什么意义?
    • 如果你有 x 和 y 都锁定自己,你不能同时访问它们。在很多情况下,您可能不需要使用不同的锁,但是如果您在多个线程之间共享对象并具有许多属性,那么它可能会提高性能。仅当您进行了一些测试并且对性能不满意并且测试将其突出显示为瓶颈时才这样做...
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多