2013-10-03 65 views
0

我想延遲加載一個實例變量 - 但如果它是從類的外部設置我不想強烈指向它。懶加載一個弱實例變量

這可能嗎?

例如:

@interface MyClass 

@property (nonatomic,weak) LazyLoadedObject lazyObject; 
@end 

@implemetation MyClass 

-(LazyLoadedObject *)lazyObject 
{ 
    if (_lazyObject== nil) 
    { 
    //create a object and strongly point to it 
    _lazyObject = [LazyLoadedObject new] 
    } 
    return _lazyObject; 
} 
@end 
+0

你需要指定誰擁有對象 - 主人需要保留它。這是否類擁有與否。確定一種方式或其他。 – Wain

回答

1

創建另一個屬性您個人,您將有很強的參考,如果需要的話。

@property (nonatomic, weak) id lazyObject; 
@property (nonatomic, strong) id privateLazyObject; 

然後實現getter方法是這樣的:

- (id)lazyObject { 
    // If contains value, return that, otherwise redirect to private strong value. 
    return self->_lazyObject ?: self.privateLazyObject; 
} 

- (id)privateLazyObject { 
    // Standard lazy getter 
    if (! self->_privateLazyObject) { 
     self.privateLazyObject = ...; // Strong ownership 
    } 
    return self->_privateLazyObject; 
} 

所以,當你設置的公共lazyObject,抵消您的私人之一:

- (void)setLazyObject:(id)lazyObject { 
    self->_lazyObject = lazyObject; // Weak ownership 
    self.privateLazyObject = nil; // Release any existing strong one. 
} 
0

使屬性strong,因爲要 「強烈指向它。」