Obj-C: C функции, объявленные внутри или снаружи @implementation блок, каково различие?

dat$e <- rowSums(dat[,c("b", "c")], na.rm=TRUE)
dat
#   a  b c d e
# 1 1  2 3 4 5
# 2 5 NA 7 8 7
7
задан jlpiedrahita 22 June 2009 в 17:43
поделиться

2 ответа

Хотя это законно, я не понимаю, почему это требуется в описанном вами случае (и это уродливое решение). Почему вы не можете просто вызвать:

[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 (другое распространенное использование -> ), я предпочитаю использовать временный, а затем назначать его позже.

Я считаю факт что ivars не являются @private по умолчанию, чтобы быть ошибкой в ​​ObjC .... Я помещаю @private в начало каждого блока @interface и имею Таким образом удалось избежать нескольких неприятных ошибок.

Кстати, ваше решение в том виде, в котором оно написано, может иметь утечку NSColor . Может быть, а может и нет, но аксессуар обязательно.

Я предпочитаю использовать временный, а затем назначать его потом.

Я считаю тот факт, что ivars не @private по умолчанию, является ошибкой в ​​ObjC .... Я поставил @private в верхней части каждого блока @interface и таким образом удалось избежать нескольких неприятных ошибок.

Кстати, ваше решение, как написано, может пропускать NSColor . Может быть, а может и нет, но аксессуар обязательно.

Я предпочитаю использовать временный, а затем назначать его потом.

Я считаю тот факт, что ivars не @private по умолчанию, является ошибкой в ​​ObjC .... Я поставил @private в верхней части каждого блока @interface и таким образом удалось избежать нескольких неприятных ошибок.

Кстати, ваше решение, как написано, может пропускать NSColor . Может быть, а может и нет, но аксессуар обязательно.

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

Это будет нормально работать, если оно находится внутри вашего @implementation. Я бы порекомендовал вам сделать это обычным методом, но он работает.

Если вы уберете его из своей реализации, вы получите следующее предупреждение: Предупреждение: переменная экземпляра '' равна @protected; это будет серьезной ошибкой в ​​будущем. Вы можете избежать этой ошибки, поместив @public перед iVar в заголовке ... вот так:

@public 
int myInt;

Это позволяет вам получить доступ к таким переменным, как C (указатель) Struct, где бы объект ни появился без предупреждения.

Так что это выполнимо, но не рекомендуется !!!

2
ответ дан 7 December 2019 в 14:37
поделиться
Другие вопросы по тегам:

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