Как установить и получать доступ к вариабельным значениям из другого класса
-
04-10-2019 - |
Вопрос
Я модифицирую пример примерки Quartzdemo и хочу сделать установить и читать значения целочисленных переменных типа в других классах, которые уже включены.
Например, в MainViewController.M я хочу установить числовое значение (простые числа из 1-100) на переменную, которая затем будет называться (READ) в файле Quarzimages.M.
Вопрос: Как определить переменную правильно, набор и доступ (прочитать) значение.
Я начинающий с Obj C и iPhone SDK в целом и иметь некоторый опыт работы с Delphi и VB, но это вообще не помогает :)
Спасибо, кто и где бы вы ни находились, человек, который отвезет меня из этой бесконечной густой петлей.
Решение
Если у вас есть переменная, есть два способа чтения и установки свойств (которые обычно являются комбинацией методов IVAR и Accessor). Старый путь (по-прежнему предпочитаемый какой-то) должен напрямую использовать методы аксессуаров:
//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]
Новый способ - использовать точечный синтаксис (который работает только для свойств и не может использоваться с более сложными методами):
int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]
Если это запутает вас, я бы очень рекомендую поднять копию Книга Aaron Hillegass. Отказ Это объясняет какао и объективную к среди подробностей.
РЕДАКТИРОВАТЬ: Я думаю, что часть путаницы здесь с терминологией. В Objective-C большинство объектов имеют переменные экземпляра (Ивар), которые фактически хранят данные. Однако в целом вы хотите избежать напрямую доступ к Иварам, особенно от других объектов. (Это принцип объектно-ориентированного дизайна и на самом деле не специфичен для объекта.)
Основная причина этого - повысить гибкость - если у меня есть класс Person
у этого есть переменная экземпляра age
, Например, я могу захотеть изменить мою реализацию в будущем, чтобы динамически определить возраст. Если другие классы полагаются на переменную экземпляра age
, они сломаются при изменении реализации.
Способ этой проблемы состоит в том, чтобы использовать доступ к ресурсам, которые являются методами, которые контролируют доступ к Иварю. В объекте - C, «Getters» получают переменную и обычно называются той же, что и переменная (так что в Person
Пример, Getter будет -(int)age
) и «Соседниты» установили переменную (она будет названа -(void)setAge:(int)theAge
). Если вы используете Accessors, вы можете свободно изменить свою реализацию в будущем, даже полностью избавиться от Ивара, если это необходимо, без разбитых классов.
В Objective-C комбинация Ивара и доступами часто называют «свойством» (хотя там не нужно, чтобы быть Иваром, если значение динамически создано). Если вы думаете с точки зрения свойств, вам не нужно беспокоиться о Иварах в других классах - они детали реализации. Objective-C 2.0 имеет хороший синтаксический сахар для создания свойств:
//Person.h
@interface Person : NSObject {
int age;
}
@property (assign) int age; //declares the accessors
@end
//Person.m
@implementation Person
@synthesize age; //implements -(int)age and -(void)setAge:theAge
@end
Важно помнить, - это большую часть времени, вы должны подумать с точки зрения свойств, а не Ивар. Вы никогда не должны напрямую доступа к Иварам в других классах. Вы должны редко (если когда-либо) доступа к Иварам в суперклассах. Если вы пирист, вы даже не должны напрямую доступа к Иварам в одном классе, за исключением доступа, init
, а также dealloc
(а последние два подлежат дебатам).