Хотя это законно, я не понимаю, почему это требуется в описанном вами случае (и это уродливое решение). Почему ты не можешь просто позвонить:
[dealie setFrognatz:[NSColor plaidColor]];
Если вы обычно не предоставляете -setFrognatz:
, просто сделайте его закрытым методом, объявив его внутри .m, но выше определения этой функции. (На самом деле не имеет значения, находится ли он в блоке @implementation
в этом случае.)
@interface BWOblateSphereoid ()
- (void)setFrognatz:(NSColor *)acolor
@end
@implementation OblateSphereoid
void drawEggThunk (DrawingContext *context, Rect areaToDraw, void *userData)
{
BWOblateSphereoid *dealie = (BWOblateSphereoid *)userData;
[dealie setFrognatz:[NSColor plaidColor]];
// and more stuff.
} // drawEggThunk
...
@end // OblateSphereoid
Есть несколько мест, где запись ->
может быть полезна. Наиболее критичным является реализация -copyWithZone:
, когда это может быть абсолютно обязательным (требование, которое действительно подчеркивает, почему я ненавижу любой код ObjC, который воспроизводит необработанную память, как NSCopyObject()
). Но я рекомендую против ->
в большинстве случаев по тем же причинам, по которым я всегда рекомендую средства доступа. Даже в том случае, когда вам нужно передать ivar по ссылке на функцию C (другое распространенное использование ->
), я предпочитаю использовать временный, а затем назначать его позже.
Я считаю, что ивары по умолчанию не являются @private
ошибкой в ObjC .... Я поставил @private
в верхней части каждого @interface
блока и таким образом избежал нескольких неприятных ошибок.
Кстати, ваше решение в том виде, в котором оно написано, может быть утечкой NSColor
. Может быть, это может быть, а может и нет, но определитель доступа будет уверен.