Существует ли способ захватить сообщения, отправленные в ноль в Objective C?

Мои $ 0,02, я нашел этот ответ и закодировал правильное решение. (Спасибо Alnitak за отзыв о HSV!)

Для копирования + вставки:

  private float interpolate(float a, float b, float proportion) {
    return (a + ((b - a) * proportion));
  }

  /** Returns an interpoloated color, between <code>a</code> and <code>b</code> */
  private int interpolateColor(int a, int b, float proportion) {
    float[] hsva = new float[3];
    float[] hsvb = new float[3];
    Color.colorToHSV(a, hsva);
    Color.colorToHSV(b, hsvb);
    for (int i = 0; i < 3; i++) {
      hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
    }
    return Color.HSVToColor(hsvb);
  }
11
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

Вы можете использовать недокументированный трюк ObjC или dtrace (см. Комментарии к решению dtrace).

pid$1::objc_msgSend:entry
/arg0==0/
{
  ustack();
}
9
ответ дан 3 December 2019 в 08:57
поделиться

Обмен сообщениями nil очень часто используется в ObjC. Люди могут спорить, хорошо это или плохо; это просто то, к чему нужно привыкнуть. Если вы попытаетесь сломать его с помощью уловок, то вы сломаете Какао, потому что Какао его использует. Есть некоторые уловки (например, diciu posted), которые сделают возможным отладку в ситуациях, когда вы подозреваете, что обмен сообщениями нулевой, но просто не можете его найти. Но вы не можете просто оставить их в своем коде (и сообщение в блоге выше поясняет это). Обмен сообщениями nil слишком распространен внутри фреймворков.

Тем не менее, сравните с исходной точкой:

- (void)doSomethingWith:(id)x {
    NSAssert(x != nil, @"Don't pass me nil");
    [x something];
}

vs.

void Bar::DoSomething(Foo *x) {
    assert(x != NULL);
    if (x != NULL) {
       x.something;
    }
}

В обоих случаях вам нужно протестировать, и в обоих случаях компилятор не предупредит вас если не получится проверить. Единственная разница в том, в каких случаях вы сбой / assert. Лично, Я пишу макросы вокруг NSAssert () , благодаря которым он всегда выводит сообщение журнала в случае сбоя. Просто вылетает только в Debug. Таким образом, когда клиент отправляет мне журналы, я могу видеть, какие утверждения не удались.

4
ответ дан 3 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

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