careerTitleLabel
- указатель на объект.Поэтому, когда вы делаете addSubview: careerTitleLabel
, код, который вы вызываете, сохраняет ссылку на careerTitleLabel
.
Позже, когда вы устанавливаете фрейм на careerTitleLabel
в layoutSubviews
, вы обновляете тот же объект.
layoutSubviews
- абсолютно правильное место для этого.Он вызывается автоматически в начале и снова, если границы представления меняются.Например, если ориентация устройства изменяется.
viewWithTag
- это еще один способ доступа к подпредставлению.Лично я считаю чище поддерживать ивару.Не забывайте, что вы можете использовать IBOutlets для подключения этих вещей с помощью Interface Builder.
Наконец, у вас есть проблема с памятью, и это объясняет количество сохранений.Хорошо запускать Analyze часто, чтобы выявить эти проблемы, а также профилировать с инструментами, используя утечки.Вы даже можете установить флаг в настройках вашей сборки, чтобы всегда запускать Analyze каждый раз, когда вы строите.
В любом случае, вот в чем проблема:
self.careerTitleLabel = [[UILabel alloc] init];
Если ваше свойство в файле .h настроенокак:
@property (nonatomic, retain)
тогда вы будете чрезмерно удерживать здесь.Вы сохраните его дважды, и это вызовет проблемы с памятью.
В рекомендациях Apple рекомендуется никогда не вызывать эти сеттеры в методе init.На этом этапе поведение может быть непредсказуемым, так как вы можете пройти через пользовательский набор, какой бы метод ни был, пока ваш объект еще не завершил его инициализацию.
Намного безопаснее просто иметь:
careerTitleLabel = [[UILabel alloc] init];
Еще лучше, в вашем .h файле префикс этого с «m» для переменной члена.Тогда у вас будет
mCareerTitleLabel = [[UILabel alloc] init];
В вашем синтезе используйте:
synthesize careerTitleLabel = mCareerTitleLabel;
Это будет означать, что извне - или изнутри - вашего кода, вы можете получить доступ к этому как:
self.careerTitleLabel
или
myObjectName.careerTitleLabel
Надеюсь, это поможет!Это много, чтобы покрыть!