Должен ли я объявить переменные в интерфейсе или использовать свойство в arc-target?

Подход 1:

@interface MyController : UIViewController {
    UILabel *myText;
}

@property (nonatomic, strong) UILabel *myText;

подход 2:

@interface MyController : UIViewController
@property (nonatomic, strong) UILabel *myText;

подход 3:

@interface MyController : UIViewController {
    UILabel *myText;
}

Я прочитал несколько статей, рассказывающих о подобных вещах, но я до сих пор не понимаю, какой подход я должен принять.

Я также обнаружил, что кто-то сказал, что подход 1 - это старый способ, поэтому я хотел бы узнать лучшие практики для ios sdk 6 с использованием ARC.

Я знаю, что объявление переменных с использованием свойства - это простой способ создания методов получения и установки, и кто-то предложил использовать его. Тем не менее, я хотел бы спросить, если переменная не предназначена для вызова другим классом, это необходимо для переменной, использующей свойство? и установить его как частную переменную внутри интерфейса? Или лучше, если переменная только внутри интерфейса? Я хотел бы изучить лучшие практики, поэтому, пожалуйста, прости меня, если это глупый вопрос.

Более того, некоторые разработчики пишут @synthesize таким образом

@synthesize myText=_myText;

но некоторые пишут это:

@synthesize myText;

Я также хотел бы знать разницу и какой предпочтительнее?

Большое спасибо!

2 ответа

Решение

Самый современный способ 1:

  • по возможности, объявлять свойства
  • не объявляйте iVars отдельно 2
  • не @ Synthesize 3
  • найдите как можно меньше свойств в вашем.h файле 4
  • найдите как можно больше свойств в расширении класса в вашем файле.m 5

1 По состоянию на Xcode 4.5.2. Большая часть этого относится к 4.4, часть не будет компилироваться на 4.2 (последняя версия, доступная под Snow Leopard). Это препроцессор, поэтому он полностью совместим по крайней мере с iOS5 (я не тестировал на iOS4, но это тоже должно быть в порядке).

2 Нет смысла объявлять iVar, а также собственность. Я уверен, что есть несколько неясных случаев, когда вы хотите объявить iVars вместо свойств, но я не могу думать ни о каком.

3 Xcode создаст iVar с тем же именем, что и у свойства, которому предшествует _underscore. Если вам (редко) нужно другое поведение, вы можете вручную @synthesize property = someOtherName, @vikingosegundo связывает нас с этой статьей о динамических иварах, которая является примером использования для @synthesize, @RobNapier комментарии, которые вам нужно @synthesize iVar = _iVar (причудливо), если вы создаете свои собственные методы получения (только для чтения) и установки (чтение / запись) для свойства, так как в этом случае препроцессор не будет генерировать iVar для вас.

4 Общее правило для вашего интерфейса: держите его как можно более пустым. На самом деле вам вообще не нужно объявлять ваши методы, если они предназначены для частного использования. Если вы можете заставить код работать без объявления интерфейса, это путь.

5 Это блок @interface в вашем файле.m, расположенный над @implementation:

#TestClass.m

@interface TestClass()

//private property declarations here

@end

@implementation TestClass
...

Вы также можете использовать @synthesize, если вам нравится удобное оглавление ваших @synthesized свойств, к которым вы можете обратиться и прокомментировать для ясности и организации.

Кроме того, @synthesize позволяет вам установить точку останова для свойства и перехватывать при изменении его значения.

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

Другие вопросы по тегам