Подтвердить что ты не робот

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

приближается 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.

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

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

@synthesize myText=_myText;

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

@synthesize myText;

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

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

4b9b3361

Ответ 1

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

  • когда это возможно, объявить свойства
  • не объявлять iVars отдельно 2
  • не @synthesize 3
  • найдите как можно больше свойств .h file 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 связывает нас с этой статьей об динамических ivars, которая является прецедентом для @synthesize. @RobNapier комментирует, что вам нужно @synthesize iVar = _iVar (причудливо), если вы создаете свои собственные getters (readonly) и сеттеры (чтение/запись) для свойства, так как в этом случае препроцессор не будет генерировать iVar для вас.

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

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

#TestClass.m

@interface TestClass()

//private property declarations here

@end

@implementation TestClass
...

Ответ 2

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

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

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