Как установить и получать доступ к вариабельным значениям из другого класса

StackOverflow https://stackoverflow.com/questions/2883759

  •  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 (а последние два подлежат дебатам).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top