Если у меня есть свойство, скажем, в 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
или в другом месте, и не нужно беспокоиться о i t nil
. Я не помню, чтобы на самом деле приходил код, который делает это. Это рекомендуемый способ сделать это? Кроме того, я всегда хочу использовать self.bubbleArr
, чтобы убедиться, что этот метод вызывается, не так ли?
сторона примечание: имейте в виду, что если вы не используете ARC, ваш код выше утечки – Sean
Посмотрев на код, я предполагаю, что вы не хотите, чтобы ссылка на массив была изменена, поскольку она является разовой настроить. Вы можете подумать о том, чтобы сделать это «readonly' свойство, чтобы это сделать. Иначе код вроде 'object. bubbleArr = [[NSArray alloc] init] '; может испортить вещи. – Anurag
Абсолютно ничего плохого в использовании ленивой техники инициализации внутри геттера. Однако для свойства, отличного от readonly, вы должны быть уверены, что установщик правильно знает, как все работает, и если асинхронный доступ (многопоточность) - это возможность, вы должны учитывать это как в getter, так и в setter. (Я не пытался анализировать/критиковать вашу реализацию.) –