在Objective C中使用类型转换为(void *)

时间:2014-07-25 15:28:31

标签: objective-c tooltip

我使用addToolTipRect:方法设置工具提示矩形

- (NSToolTipTag)addToolTipRect:(NSRect)aRect owner:(id)anObject userData:(void *)userData

和方法stringForToolTip:获取工具提示的字符串值。

- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)data

但是,如果我发送类似

的内容,上述功能可以正常工作
[self addToolTipRect:someRect owner:self userData:@"Tool tip string"];

但是当我发送以下字符串时不起作用。错误:BAD_ACCESS

const NSString * tooltipStr = @"Tool tip string";
[self addToolTipRect:someRect owner:self userData:tooltipStr];

在这两种情况下,stringForToolTip看起来像:

- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)data
  {
     id obj = (id)data;
     NSString * str=nil;
     if ([obj isKindOfClass:[SomeClass class]]) //This is my system defined class and works fine
     {
         SomeClass * someClassObj = (SomeClass *) data;
          str = someClassObj.title;
     }
     else if([obj isKindOfClass:[NSString class]])
         str = (NSString*)obj;
     return str;
  }

注意:在stringForToolTip:方法中,我还想检查一些其他类示例[obj isKindOF:[SomeClass class]],我不想断言该值。这里的问题只是通过适当的演员获得字符串值,但我无法弄清楚如何!请告诉我哪里出错了?

编辑: 在这种情况下,获取工具提示的String值的正确方法是什么?应该考虑点或标签吗?

1 个答案:

答案 0 :(得分:1)

(void *)不是对象指针。

@"Tool tip string"工作是巧合的,因为它是一个带有(基本上)永久分配和永久地址的编译时常量。

但在代码中:

const NSString * tooltipStr = @"Tool tip string";
[self addToolTipRect:someRect owner:self userData:tooltipStr];

tooltipStr是一个通过强引用保留在内存中的对象(保留计数> 0)。由于userData:不处理对象,因此它不会产生强引用(不会增加保留计数),因此它会被释放,很快就会消失。

文件说明: 工具提示字符串是从owner获得的。 owner必须回复两条消息之一,view:stringForToolTip:point:userData:description,使用后者。请注意,NSString会回复description,因此您可以为所有者的值传递NSString。那么,你想要的是:[self addToolTipRect:someRect owner:tooltipStr userData:NULL];。仍然存在一些问题,即某些内容必须强烈引用NSString实例。

您可以:[self addToolTipRect:someRect所有者:@"工具提示字符串"用户数据:NULL];

可能最好的方法是将self作为所有者传递,将NULL作为数据传递并实现委托方法:view:stringForToolTip:point:userData:in the class。