Итерация атрибутов и IBOutlets для UIViewController - PullRequest
1 голос
/ 02 июня 2010

У меня в приложении есть универсальный UIViewController. Весь UIViewController в приложении наследуется от этого универсального.

Я пытаюсь автоматизировать освобождение и освобождение атрибутов и IBOutlets как свойств.

Я делаю первый (атрибуты) для dealloc метода и второй (IBOutlets как свойства) для viewDidUnload .

- (void) dealloc {
  [_att1 release];
  _att1 = nil;

  [_att2 release];
  _att2 = nil;

  // ...
}

- (void) viewDidUnload {
   self.att1 = nil; // att1 is an IBOutlet
   self.att2 = nil; // att2 is an IBOutlet

   // ...
}

Есть ли способ перебрать все мои атрибуты и IBOutlets для упрощения этих операций? Я хочу избежать этого для каждого выхода и атрибута и делегировать его универсальному UIViewController.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 16 июля 2010

Я не уверен, что это возможно. Кроме того, я не уверен, что это хорошая идея.

Во-первых, почему это невозможно: ключевое слово IBOutlet предназначено исключительно для Интерфейсного Разработчика. IB сканирует исходный код (или некоторую внутреннюю индексацию исходного кода в XCode), чтобы определить IBOutlets, доступные в классе. Я не верю, что в скомпилированном коде есть различие между IBOutlet и обычным свойством. Таким образом, даже если вы найдете список атрибутов или свойств, вы не сможете различить их для -[UIView viewDidUnload] в отличие от dealloc.

Во-вторых, почему это не очень хорошая идея. Управление памятью является сложным в Objective-C. Инструменты в инструментах также могут помочь определить, где выделяется избыточная память, а статический анализатор Clang (Cmd-Shift-A в XCode) может помочь вам обнаружить потенциальные утечки памяти из невыпущенных или неправильно сохраненных объектов. Любая система автоматизации выпуска на основе интроспекции наверняка запутает статический анализатор, не говоря уже о других разработчиках в вашей команде.

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

0 голосов
/ 20 июля 2010

Попробуйте получить все IBOutlets, используя [self.view subviews], и просмотрите массив, чтобы удалить их.

Для атрибутов я все еще ищу ...

0 голосов
/ 18 июля 2010

Если они на самом деле просто называются attr1, attr2, attr3 ... чем вы можете.

Использовать кодирование значения ключа

Например:

for(int i = 1; i <= numberOfAttributes; ++i) {

    [self setValue: nil forKey: [NSString stringWithFormat: @"%@%i", @"attr", i]];
    [[self valueForKey: [NSString stringWithFormat: @"%@%i", @"attr", i] release];
}

обратите внимание, что вы должны установить numberOfAttributes самостоятельно.


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

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