Мои $ 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);
}
Вы можете использовать недокументированный трюк ObjC или dtrace (см. Комментарии к решению dtrace).
pid$1::objc_msgSend:entry
/arg0==0/
{
ustack();
}
Обмен сообщениями 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. Таким образом, когда клиент отправляет мне журналы, я могу видеть, какие утверждения не удались.