2012-08-22 2 views
0

정적 NSStatusItem 및 NSStream 클라이언트가있는 Singleton 클래스가 있습니다. 스트림에서 메시지를받을 때마다 다른 스레드로 전달하여 NSStatusItem toolTip을 변경합니다. NSStatusItem을 사용한 메모리 관리 : setToolTip

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 

이제 Threadfrom StreanUtil는 메시지와 함께 setToolTip 설정하는 호출합니다. 그러나 2 ~ 3 번 통화가 끝나면 툴팁은 원래의 툴팁 메시지 끝 부분에 정크 텍스트를 표시하기 시작합니다.

내가 뭘 잘못하고 있니?

+0

마이너 포인트 : 1. getter를 사용하여 getter 메소드 이름을 시작하지 마십시오. 코코아에 대한 다른 규칙이 있습니다. 2. 대문자가 아닌 소문자로 메소드 이름을 시작하십시오. –

답변

0

SetToolTip에 전달하는 툴팁 항목은 포인터 일 뿐이므로 어딘가에 설정되거나 해제 될 것입니다. 당신의 아이폰 OS 4 또는 OS X 10.6을 대상으로하는 경우

또한이

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

뭔가를 시도하거나 나중에 내가 ARC로 이동하는 것을 고려한다. 그러면 코드가 다음과 같이됩니다.

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