【问题标题】:Memory Management with NSStatusItem : setToolTip使用 NSStatusItem 进行内存管理:setToolTip
【发布时间】:2012-08-22 21:03:37
【问题描述】:

我有一个带有静态 NSStatusItem 和 NSStream 客户端的 Singleton 类。每当我在 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 次调用后,工具提示开始在原始工具提示消息的末尾显示一些垃圾文本。

我在这里做错了什么?

【问题讨论】:

  • 次要要点: 1. 不要以get 开头您的getter 方法名称,Cocoa 有不同的约定。 2. 方法名以小写字母开头,不要大写。

标签: objective-c memory-management nsstring nsstatusitem


【解决方案1】:

由于您传递给 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]];
}

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多