Obj-C:在@implementation块内部或外部声明的C函数,有什么区别?

前端之家收集整理的这篇文章主要介绍了Obj-C:在@implementation块内部或外部声明的C函数,有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Objective-C类的实现块(@implementation … @end)内部或外部声明的C函数(静态或非静态)之间的区别是什么?

这是特别真实的吗?:

If you need to poke inside of the object directly,you can put this function inside of the @implementation block of your class,and then you can access instance variables with the C arrow operator. But that’s kind of naughty,so to preserve your Purity of Essence you should be using method calls on your object. End of Sermon. Here’s the evil:

@implementation OblateSphereoid

void drawEggThunk (DrawingContext *context,Rect areaToDraw,void *userData)
{
BWOblateSphereoid *dealie = (BWOblateSphereoid *)userData;
dealie->_frognatz = [NSColor plaidColor];
// and more stuff.
} // drawEggThunk

...
@end // OblateSphereoid

我可以通过这种方式在函数(在同一个类中声明)中访问我的类的实例变量吗?

解决方法

虽然这是合法的,但我不明白为什么在你描述的那种情况下需要它(这是一个丑陋的解决方案).为什么你不能打电话:
[dealie setFrognatz:[NSColor plaidColor]];

如果你通常不提供-setFrognatz:,只需通过在.m中声明它,但在此函数定义之上,使其成为私有方法. (在这种情况下,如果它位于@implementation块中并不重要.)

@interface BWOblateSphereoid ()
- (void)setFrognatz:(NSColor *)acolor
@end

@implementation OblateSphereoid

void drawEggThunk (DrawingContext *context,void *userData)
{
    BWOblateSphereoid *dealie = (BWOblateSphereoid *)userData;
    [dealie setFrognatz:[NSColor plaidColor]];
    // and more stuff.
} // drawEggThunk

...
@end // OblateSphereoid

有几个地方 – >符号可能会有所帮助.最关键的是实现-copyWithZone:它可以是absolutely required(这个要求真正强调了为什么我讨厌任何像NSCopyObject()那样使用原始内存的ObjC代码).但我建议反对 – >在大多数情况下,出于同样的原因,我总是推荐访问者.即使在你需要通过参考C函数(另一个常用的 – >)传递ivar的情况下,我更喜欢使用临时,然后再分配它.

我认为ivars默认情况下不是@private是ObjC中的一个错误….我把@private放在每个@interface块的顶部并避免了几个令人讨厌的错误.

顺便说一句,你写的解决方案可能是泄漏NSColor.也许它是,也许不是,但一个访问者是肯定的.

猜你在找的C&C++相关文章