Как сохранить данные в экземплярах объектов в Objective-C? - PullRequest
1 голос
/ 20 января 2010

У меня был некоторый опыт разработки для iPhone, но я полностью самоучка и пытаюсь улучшить свою практику. Этот вопрос, вероятно, довольно вводный для программирования.

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

Скажем, у меня есть объект, который отслеживает, сколько раз пользователь проводил по экрану. Можно ли, скажем, выделить этот объект в моем AppDelegate, а затем каким-то образом увеличить переменную count этого объекта из разных контроллеров представления?

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

Пока что я только что сделал IVAR в своем AppDelegate для таких вещей, которые мне нужно было отслеживать, а затем просто получил к ним доступ так:

((MyAppDelegate *)[UIApplication sharedApplication].delegate).instanceVariable

но я не знаю, хорошая это практика или нет. Вероятно, нет.

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

Ответы [ 5 ]

2 голосов
/ 20 января 2010

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

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

  1. Сделайте, чтобы Класс имел одноэлементный объект, и отслеживал распределения и освобождения, чтобы знать, когда он должен создать, а затем утилизировать себя (при необходимости). Это не плохой способ сделать это, хотя это может быть больше работы.

  2. Создайте класс контроллера, который управляет вашим другим классом объектов. Хорошим примером может служить класс представлений, управляемый классом viewcontroller.

Давайте посмотрим, что предлагают другие люди.

1 голос
/ 20 января 2010

Мэтт Галлахер опубликовал отличную статью именно по этой проблеме.Вы можете увидеть это на Какао с любовью .

Однако на шаблонах с несколькими контроллерами представления, как сказал Махбудз, делегирование предпочтительнее.

1 голос
/ 20 января 2010

В C ++ или Java (и т. Д.) Вам нужно искать «статическую переменную экземпляра», которая является именно тем, что вы описываете: переменная экземпляра, которая используется всеми экземплярами класса. В Objective-C такого зверя нет, но вы можете использовать обычный синтаксис C, чтобы получить нечто очень похожее.

См. Внизу этой страницы: http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

(Копия кода там в случае исчезновения страницы:)

@interface MyClass 
{
  // ...
}
+ (NSString *)myVar;
+ (void)setMyVar:(NSString *)newVa;
@end

@implementation MyClass
static NSString *myVar;
+ (NSString *)myVar { return myVar; }
+ (void)setMyVar:(NSString *)newVar { myVar = newVar; }
@end

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

FWIW, если вы создаете что-то, что, как правило, должно быть надежным, хорошо подойдет одноэлементный объект, который разделяют все; если вы это сделаете, вы получите все обычные качества Obj-C (управление мемами, если хотите).

0 голосов
/ 20 января 2010

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

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

0 голосов
/ 20 января 2010

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

...