Управление памятью переменных на iPhone - PullRequest
0 голосов
/ 18 мая 2009

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

int foo = 0;
foo =+ 1;

Я могу объявить переменную в другом контроллере, не инициализируя ее значение, оно будет нести значение, которое было в последний раз установлено в предыдущем контроллере представления:

int foo;
if (foo == 1)
    doSomething;

Я использовал это в своих интересах для отслеживания текущего игрока в многопользовательской игре и т. Д. ... используя данные в нескольких контроллерах, когда их представления загружаются и удаляются. Я новичок в Obj C и, исходя из того, что я читал, это не похоже на правильный путь к вещам.

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

Ответы [ 4 ]

1 голос
/ 18 мая 2009

Это не безопасный способ передачи информации между контроллерами. Если вы используете это в своем приложении, и оно работает, я на самом деле очень удивлен.

Правильный способ сделать это - передать требуемое значение от одного контроллера к другому. В приведенном ниже примере делегат приложения хранит значение, а затем каждый контроллер читает / записывает его ... это всего лишь пример, будьте осторожны с использованием делегата приложения в качестве хранилища для того, что фактически становится глобальными переменными 1004 *. Установка большого количества переменных в Application Delegate для использования таким образом усложнит обслуживание вашего приложения.

В вашем приложении Delegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate> {  
  int sharedInt;  
}
@property int sharedInt; 

В вашем приложении Delegate.m

@synthesize sharedInt;  // this will automatically create the getters and setters

Затем в контроллере, где вы хотите установить значение:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate];  
applicationDelegate.sharedInt = 3;

Затем в контроллере, где вы хотите прочитать значение:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate];  
if (applicationDelegate.sharedInt == 3) {  
   //do your stuff here
}

Отредактировано : забыли @ синтезировать.
Отредактировано : напечатано возвращение из метода одиночного делегата, основанного на предложении Кеннета Балленеггера, чтобы исключить предупреждения компилятора.

1 голос
/ 18 мая 2009

Я рекомендую сделать (и сделать) что-то похожее на ответ MMC. Однако его ответ вызовет у вас много предупреждений. Вы должны убедиться, что вы получаете объект AppDelegate *, а не какой-либо (id) объект (как вы делаете с помощью метода mmc).

Просто добавьте метод класса +singleton (или +sharedDelegate) к вашему делегату следующим образом:

+ (iLaughAppDelegate *)singleton
{
    iLaughAppDelegate *delegate = (iLaughAppDelegate *)[[UIApplication sharedApplication] delegate];
    return delegate;
}
1 голос
/ 18 мая 2009

Звучит так, как будто вы объявляете глобальную переменную (которую допускает C), и это не рекомендуемая практика передачи значений между контроллерами представления.

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

0 голосов
/ 18 мая 2009

Это нормально, если все сделано правильно, но должно быть сделано только для данных только для чтения. Это очень распространенный способ обмена строковыми константами. Например:

myobject.h

extern NSString* const MyObjectWillChangeNotification;

MyObject.m

NSString* const MyObjectWillChangeNotification = @"MyObjectWillChangeNotification";

AnotherObject.m

#import "MyObject.h"
// You can now use MyObjectWillChangeNotification in this file

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

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