Почему самореализованный метод get должен сохранить и автовыпустить возвращенный объект?

К сожалению, расположение по умолчанию для кнопок на AdaptiveCards находится внизу карты, и вы не можете изменить это. Однако вы можете добавить изображение, стилизованное для карты, с помощью атрибута selectAction, который будет отправлять данные, связанные с действием, когда пользователь щелкает изображение. Для получения дополнительной информации см. Пример AdaptiveCard JSON ниже и документацию по AdaptiveCard для изображений и . Выберите Действия .

Скриншот

enter image description here

JSON

{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "size": "Large",
            "weight": "Bolder",
            "color": "Accent",
            "text": "Company Name"
        },
        {
            "type": "TextBlock",
            "separator": true,
            "size": "Medium",
            "text": "Meeting Details"
        },
        {
            "type": "TextBlock",
            "text": "Description:"
        },
        {
            "type": "TextBlock",
            "text": "Keynote Speaker:"
        },
        {
            "type": "TextBlock",
            "text": "Date:"
        },
        {
            "type": "Image",
            "selectAction": {
                "type": "Action.Submit",
                "data": "Meeting 1"
            },
            "url": "C:\\Users\\v-thdurn\\Developer\\Node\\Azure\\thdurn-all-channels-src\\resources\\button.png"
        },
        {
            "type": "TextBlock",
            "separator": true,
            "size": "Medium",
            "text": "Meeting Details"
        },
        {
            "type": "TextBlock",
            "text": "Description:"
        },
        {
            "type": "TextBlock",
            "text": "Keynote Speaker:"
        },
        {
            "type": "TextBlock",
            "text": "Date:"
        },
        {
            "type": "Image",
            "selectAction": {
                "type": "Action.Submit",
                "data": "Meeting 2"
            },
            "url": "C:\\Users\\v-thdurn\\Developer\\Node\\Azure\\thdurn-all-channels-src\\resources\\button.png"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.0"
}

Надеюсь, это поможет!

11
задан Thanks 29 April 2009 в 10:54
поделиться

3 ответа

Отсюда http://www.macosxguru.net/article.php?story=20030713184140267

- (id)getMyInstance
    {
        return myInstanceVar ;
    }

или

- (id)getMyInstance
{
    return [[myInstanceVar retain] autorelease] ;
}

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

aLocalVar = [aContainer getAnInstanceVar] ;
[aContainer release];
doSomething(aLocalVar);

Если «get» реализован в первой форме, вы должны написать:

aLocalVar = [[aContainer getAnInstanceVar] retain];
[aContainer release];
doSomething(aLocalVar);
[aLovalVar release];

Первая форма немного более эффективна с точки зрения скорости выполнения кода. Однако, если вы пишете фреймворки, которые будут использоваться другими, возможно, следует рекомендовать вторую версию: она немного облегчает жизнь людям, использующим вашу фреймворк: им не нужно слишком много думать о том, что они делают…; ) Если вы выбираете первую версию стиля, четко указывайте ее в своей документации… Какой бы путь вы ни выбрали, помните, что переход с версии 1 на версию 2 экономит код клиента, а при переходе от версии 2 к версии 1 сломается существующий клиент код ...

12
ответ дан 3 December 2019 в 05:14
поделиться

Это не только для случаев, когда кто-то освобождает контейнер, так как в этом случае более очевидно, что они должны сохранить объект самостоятельно. Рассмотрим следующий код:

NSString* newValue = @"new";
NSString* oldValue = [foo someStringValue];
[foo setSomeStringValue:newValue];
// Go on to do something with oldValue

Это выглядит разумно, но если ни установщик, ни получатель не используют autorelease, то часть «Продолжай делать что-то», скорее всего, вылетит, потому что oldValue теперь освобожден (при условии, что никто другой не сохранил его). Вы обычно хотите использовать Технику 1 или Технику 2 от Apple '

7
ответ дан 3 December 2019 в 05:14
поделиться

Я не видел такой схемы раньше, но она кажется мне совершенно бессмысленной. Я предполагаю, что цель состоит в том, чтобы сохранить возвращаемое значение в безопасности, если клиентский код вызывает «release» для родительского объекта. На самом деле это ничего не ранит, но я сомневаюсь, что такая ситуация часто возникает в хорошо спроектированных библиотеках.


Ах, хорошо. Судя по документации, на которую ссылается smorgan, теперь это один из методов, которые Apple рекомендует сейчас использовать. Я думаю, что я все еще предпочитаю версию старой школы:

- (NSString *) value
{
    return myValue;
}

- (void) setValue: (NSString *) newValue
{
    if (newValue != myValue)
    {
       [myValue autorelease]; // actually, I nearly always use 'release' here
       myValue = [newValue retain];
    }
}
0
ответ дан 3 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

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