Как назвать именованные шаблоны на основе переменной?

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

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

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

пера

Примечание: следующие комментарии применяются только к iOS до 3,0. С 3,0 и позже, Вы должны вместо этого просто ноль значения свойств в viewDidUnload.

Одно соображение здесь, тем не менее, состоит в том, когда Ваш контроллер мог бы избавиться от своего пользовательского интерфейса и перезагрузить его динамично по требованию (например, если у Вас есть контроллер представления, который загружает представление из файла пера, но по запросу - говорят под давлением памяти - выпускает его, с ожиданием, что оно может быть перезагружено, если представление необходимо снова). В этой ситуации Вы хотите удостовериться, что, когда основное представление расположено Вас также, оставляют владение любых других выходов так, чтобы они также могли быть освобождены. Для UIViewController можно заниматься этой проблемой путем переопределения setView: следующим образом:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

, К сожалению, это дает начало дальнейшей проблеме. Поскольку UIViewController в настоящее время реализует dealloc метод с помощью setView:, метод доступа (вместо того, чтобы просто выпустить переменную непосредственно), self.anOutlet = nil назовут в dealloc, а также в ответ на предупреждение памяти... Это приведет к катастрофическому отказу в dealloc.

средство должно гарантировать, что переменные выхода также установлены на nil в [1 110]:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}
14
задан Dimitre Novatchev 18 December 2010 в 21:06
поделиться

3 ответа

Нет, это невозможно напрямую невозможно. Соглашение о вызовах:

<xsl:call-template name="QName" />

Где QName определяется как :

QName ::= PrefixedName | UnprefixedName

PrefixedName   ::= Prefix ':' LocalPart
UnprefixedName ::= LocalPart

Prefix         ::= NCName
LocalPart      ::= NCName

В основном это сводится к «только символы, без выражений». Как подчеркивают другие ответы,

6
ответ дан 1 December 2019 в 12:01
поделиться

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

<xsl:stylesheet ... xmlns:t="urn:templates">

  <!-- Any compliant XSLT processor must allow and ignore any elements 
       not from XSLT namespace that are immediate children of root element -->
  <t:templates>
    <t:foo/>
    <t:bar/>
  </t:templates>

  <!-- document('') is the executing XSLT stylesheet -->     
  <xsl:variable name="templates" select="document('')//t:templates" />

  <xsl:template name="foo" match="t:foo" mode="call-template">
    Bla bla bla
  </xsl:template>

  <xsl:template name="bar" match="t:foo" mode="call-template">
    Bla bla bla
  </xsl:template>

  <xsl:template match="/">
    <xsl:variable name="template-name" select="..." />
    <xsl:apply-templates select="$templates/t:*[local-name() = $template-name]"
                         mode="call-template"/>
  </xsl:template>

Обратите внимание, что вы можете использовать в , так что вы можете делать с этим все, что могли. с простым .

Кроме того, приведенный выше код несколько длиннее, чем вам может понадобиться, потому что он пытается избежать использования каких-либо расширений XSLT. Если ваш процессор поддерживает exslt: node-set () ,

12
ответ дан 1 December 2019 в 12:01
поделиться

Обновление : приведенные ниже ссылки были обновлены и теперь указывают на web.archive.org - к сожалению, IDEALLIANCE закрыла все материалы конференции Exteme Markup Languages ​​. . В свое время я найду более постоянное место для этих двух статей.


Это реализовано в FXSL .

Есть хорошие объяснения основных принципов FXSL.

См. следующие две статьи:

« Функциональное программирование в XSLT с использованием библиотеки FXSL » (для XSLT 1.0), (PDF) по адресу:

http://web.archive.org/web/20070710091236 /http://www.idealliance.org/papers/extreme/proceedings/xslfo-pdf/2003/Novatchev01/EML2003Novatchev01.pdf

(HTML) по адресу:

http://conferences.idealliance.org/extreme /html/2003/Novatchev01/EML2003Novatchev01.html[12146 visible" Функциональное программирование высшего порядка с XSLT 2.0 и FXSL »(PDF) по адресу:

http://web.archive.org/web /20070222111927/http://www.idealliance.org/papers/extreme/proceedings/xslfo-pdf/2006/Novatchev01/EML2006Novatchev01.pdf

(HTML) по адресу: http://conferences.idealliance.org/extreme/html/2006/Novatchev01/EML2006Novatchev01.html



Используя FXSL, я смог легко и элегантно решить многие проблемы, которые казались «невозможными для XSLT». Примеров можно найти здесь .

2
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: