Хорошая практика объявлять свойства в файле реализации. Если да, то какой смысл использовать?

Является ли следующий код, хорошей практикой программирования в objective-C?

  #import "Custom.h"

  @interface Custom () 
  @property (nonatomic, retain) UILabel *label;
  @end

  @implementation Custom
  @synthesize label;

  - (void) dealloc {
      [label release];
      [super dealloc];
  }

  @end

Ответ 1

Идея заключается в том, что все свойства, которые вы объявляете в своем заголовочном файле, видимы и доступны для всех вне этого класса. Чтобы уважать принцип инкапсуляции ООП, вы хотите, чтобы охват определенных членов вашего класса был как можно более закрытым. Таким образом, все те члены, которые будут использовать только ваш класс, должны быть скрыты для "внешнего мира". Это можно сделать, объявив специальный тип категории под названием "расширение" (он не может иметь имя, он объявлен как @interface Class()) и свойства внутри этого расширения (вместе с объявлением частного метода, если вы хотите как а)

Что касается вопроса о том, является ли это хорошей практикой, которая может обсуждаться среди разных разработчиков. Для меня это хорошая практика ООП, а также потому, что она помогает сохранить ваш заголовочный файл как можно более чистым (и, таким образом, чтобы другие разработчики могли видеть, какие "службы" предоставляют ваш класс)

Ответ 2

Мне нравится делать это для создания частных интерфейсов. Если свойство используется только в вашей реализации, а не в сотрудничестве с другими объектами, оно не должно загрязнять заголовок (который определяет открытый интерфейс). Вы также можете скрыть частные реализации протокола следующим образом:

@interface YourClass () <UIAlertViewDelegate>

Таким образом, пользователи вашего класса не должны знать, что у вас есть UIAlertView где-то в вашей реализации.

Что можно считать недостатком, так это то, что ваши подклассы больше не могут обращаться к свойствам "private". Вам нужно либо переместить свое объявление в заголовочный файл (сделать его общедоступным), либо создать специальный "защищенный" заголовок.

Другим вариантом, заслуживающим упоминания в этом контексте, является объявление частных переменных в директиве @implementation:

@implementation YourClass {
    NSString *foo;
    NSUInteger bar;
}

Это не статика, они являются регулярными переменными экземпляра.

Ответ 3

Вы хотите определить label в своем заголовке для последующего использования с помощью других методов в @implementations. Например, создайте этот ярлык в viewDidLoad, и вы можете изменить его во всех других методах.