这是特别真实的吗?:
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.也许它是,也许不是,但一个访问者是肯定的.