【发布时间】:2012-05-28 22:16:31
【问题描述】:
如果我有一个属性,比如一个 NSArray,它只会为我的类的每个实例初始化一次,这有什么问题吗:
(在界面中)
@property(strong, nonatomic)NSArray *bubbleArr;
(在实现中)
-(NSArray*)bubbleArr
{
if(!bubbleArr)
{
NSMutableArray *tempBubbArr = [[NSMutableArray alloc] init];
// get filepath for first speech bubble image for page
NSString *speechBubbleImgPath = [[NSBundle mainBundle] pathForResource:
[NSString stringWithFormat:@"speech_%i_0", pageIndex]
ofType:@"png"];
for(int i = 1; speechBubbleImgPath; i++)
{
UIImage *speechBubbleImg = [[UIImage alloc] initWithContentsOfFile:speechBubbleImgPath];
UIImageView *speechBubbleImgView = [[UIImageView alloc] initWithImage:speechBubbleImg];
[tempBubbArr addObject:speechBubbleImgView];
speechBubbleImg = nil;
speechBubbleImgView = nil;
speechBubbleImgPath = nil;
speechBubbleImgPath = [[NSBundle mainBundle] pathForResource:
[NSString stringWithFormat:@"speech_%i_%i", pageIndex, i]
ofType:@"png"];
}
bubbleArr = [[NSArray alloc] initWithArray:tempBubbArr];
tempBubbArr = nil;
}
return bubbleArr;
}
我从未使用过自定义访问器方法,但这似乎是一种干净的设置方式,因此我不必在viewDidLoad 或其他地方设置每个属性,也不必担心关于它是nil。我不记得曾经真正遇到过这样做的代码。这是推荐的方法吗?另外,我总是想使用self.bubbleArr 来确保调用此方法,对吗?
【问题讨论】:
-
旁注:请注意,如果您不使用 ARC,则上面的代码会泄漏
-
查看代码,我猜您不希望更改数组引用,因为它是一次性设置。您可以考虑将其设为
readonly属性以确保这一点。否则代码如object. bubbleArr = [[NSArray alloc] init];可能会把事情搞砸。 -
在 getter 中使用惰性初始化技术绝对没有错。但是,对于非只读属性,您需要确保 setter 适当地了解事情的工作方式,并且如果异步访问(多线程)是可能的,您需要在 getter 和 setter 中考虑到这一点。 (我没有尝试分析/批评您的实施。)
-
啊好吧我想知道我是否应该让它只读。谢谢!
标签: objective-c ios getter accessor