我使用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值的正确方法是什么?应该考虑点或标签吗?
答案 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。