Переменные экземпляра Objective C, зачем мне их объявлять? - PullRequest
1 голос
/ 24 июня 2011

Мне трудно понять, почему мне нужно объявлять переменные экземпляра. Позвольте мне объяснить, что я имею в виду ..

например ..

@interface LearningViewController : UIViewController {
  UILabel *myText; // <--- Instance Variables
}

@property (nonatomic,retain) IBOutlet UILabel *myText;

-(IBAction)method:(id)sender;

@end

это также можно сделать как

@interface LearningViewController : UIViewController {
  //instance variables go here, but are not declared, I just leave this field blank
}

@property (nonatomic,retain) IBOutlet UILabel *myText;

-(IBAction)method:(id)sender;

@end

как вы можете видеть ... в последнем примере я создал ТОЛЬКО сеттер / геттер для UILabel * myText

но в первом я тоже объявил переменные экземпляра.

Оба заканчивают тем, что работали в конце

@implementation LearningViewController

@synthesize myText;


-(IBAction)method:(id)sender {
  [myText setText:@"hey"];

  //or

  NSString *myObject = [[NSString alloc]initWithString:@"hey"];

  [myText setText:myObject];    
}

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

NSString *myObject = [[NSString alloc]initWithString:@"hey"];

myText.text = myObject;

когда я могу просто сделать

[myText setText:@"hey"];

заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 24 июня 2011

Кроме того, бывают случаи, когда вы хотите использовать защищенный или приватный iVar внутри класса, а не создавать из него свойство.(например, если вы не хотите разрешать доступ к iVar ни к чему, кроме экземпляра этого класса (частного) или его потомков (защищенного). Свойства, объявленные в заголовке, доступны любому объекту, который может «видеть»целевой объект. Автоматическое объявление ivars в заголовке как свойств (с объявлением внутри фигурных скобок или без него) может быть плохим с точки зрения сокрытия информации.

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

1 голос
/ 24 июня 2011

Изначально Objective-C не имел свойств, а @ synthesize не существовало.Вы должны были объявить свой iVar (экземпляр переменной) и написать свои собственные установщики и получатели.

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

Позже язык и среда выполнения развивались все больше, и сегодня вам даже не нужно объявлять свой iVar.(Хотя я обычно пишу @synthesize example = _example; поэтому я могу контролировать, как называется сгенерированный iVar.)

Это новая функция, которая поддерживается только относительно недавними версиями среды выполнения.Версии iOS ниже 4.x не поддерживаются, как и более старые версии OSX.

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

0 голосов
/ 24 июня 2011

Вы можете опустить iVars, однако я не согласен опускать iVars.Файл .h в ООП обычно является заголовочным файлом, который отображает все переменные и методы.Это объявляет их.Предполагая, что в будущем вы захотите увидеть, что делает этот класс, вы просто обратитесь к файлу .h.Или предполагая, что кому-то еще нужно взглянуть на этот класс, или использовать этот класс со своим кодом для связи с ним.Это облегчает просмотр переменных, просмотр того, что объявлено, а что нет.То есть, если вы хотите профессионально программировать.

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

Теперь иногда делаем

[myText setText@"hello"];

работает.Это действительно зависит от вашего кода.Я думаю, что единственный способ действительно понять разницу в ситуациях - это практика.Иногда вам нужно установить метку в другой объект, создавая таким образом объект.В противном случае он автоматически освобождается и т. Д. *

В любом случае, в основном, используйте переменные экземпляра только для переменных, которые будут использоваться глобально.И, конечно, элементы пользовательского интерфейса (поскольку они используются всем классом и создателем интерфейса).

Надеюсь, это поможет.

0 голосов
/ 24 июня 2011

Во второй части вопроса вы просто используете точечную запись.Вы можете установить myText.text равным @ "эй", так же, как вы делаете это во втором примере.

[myText setText:@"hey"]; 

является синонимом

myText.text = @"hey";

Выне нужно объявлять строку NSString, чтобы удерживать ваше значение раньше времени.

0 голосов
/ 24 июня 2011

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

Одно критическое исключение из этого - когда вы компилируете для старой (<4.0) среды выполнения iOS, а также, возможно, для 32-разрядной среды выполнения Mac OS X с использованием GCC, который не поддерживает синтез переменных экземпляра. </p>

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

Редактировать: Короче говоря: Наследие, переносимость и расширяемость запрещают явные ивары. Для приложений с таргетингом на 10,6, особенно на 10,7, их практически нет необходимости объявлять.

...