0

我有一个带有静态 NSStatusItem 和 NSStream 客户端的单例类。每当我在 Stream 中收到一条消息时,我都会将它传递给另一个线程以更改 NSStatusItem 工具提示。

  case NSStreamEventHasBytesAvailable: 
    {
        if(stream == inputStream)
        {
            //InputStream ready
            uint8_t buf[1024];
            unsigned int len = 0;
            len = [inputStream read:buf maxLength:1024];
            if(len > 0) 
            {
                NSMutableData* data=[[NSMutableData alloc] initWithLength:0];
                [data appendBytes: (const void *)buf length:len];
                NSString *msgRcvd = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
                NSLog(@"Message Recieved in StreamUtil ::: %@",msgRcvd);
                [self ProcessMessage:msgRcvd];
                [data release];
                [msgRcvd release];
            }
        }
        break;
    }


 @implementation SBNSStatusItem
 static SBNSStatusItem *sbNSStatusItem = NULL;
 +(SBNSStatusItem *) GetSBNSStatusItem
 {
    @synchronized(self)
    {
     if (sbNSStatusItem== NULL)
      {
        sbNSStatusItem= [[self alloc] init];
      }
    }
    return(sbNSStatusItem);
 }

 -(void) CreateNSStatusItem
 {
     // Initalization of NSStatusItem with NSMenu and Image setting
 }

 -(void) SetToolTip:(NSString *) toolTip
 {
   NSLog(@"%@",toolTip);  // Shows Correct Message
   [statusItem setToolTip:toolTip]; // But the ToolTip has some junk at the end of ori msg
   //[toolTip release]; // EXC_BAD_ACCESS
 }
 @end

现在,来自 StreanUtil 的 Thread 使用要设置的消息调用 setToolTip。但是在 2 或 3 次调用之后,工具提示开始在原始工具提示消息的末尾显示一些垃圾文本。

我在这里做错了什么?

4

1 回答 1

0

由于您传递给 SetToolTip: 的工具提示项只是一个指针,因此它可能会在其他地方设置或释放。

尝试这样的事情

- (void)SetToolTip:(NSString *) toolTip
{
    NSString *toolTipCopy = [toolTip copy];
    [statusItem setToolTip:toolTipCopy];
    [toolTipCopy release];
}

此外,如果您的目标是 iOS 4 或 OS X 10.6 或更高版本,我会考虑迁移到 ARC。然后代码就会变成这样。

- (void)SetToolTip:(NSString *) toolTip
{
    [statusItem setToolTip:[toolTip copy]];
}
于 2012-08-22T21:29:00.187 回答