0

長年のリスナー、ここでの初めての発信者なので、私が十分に明確でない場合は私を許してください。私は現在、NSErrorオブジェクトの問題に頭を悩ませています。設定方法は次のとおりです。

-(void)mainMethod {
   NSError *myError = nil;
   NSString *myString = @"A really great string. 1234.";
   if ([self parseAndStoreString:myString error:&myError] == NO) {
      [self popupWithErrorMessage:[[myError localizedDescription] copy]];
   }

-(BOOL)parseAndStoreString:(NSString *)incomingString error:(NSError *__autoreleasing *)err {
   if ([self setupSomething error:err] == NO) {
      return NO;
   }
   if ([self doSomethingWithString:incomingString error:err] == NO) {
      return NO;
   }
   if ([self storeString:incomingString error:err] == NO) {
      return NO;
   }
}

-(BOOL)doSomethingWithString:(NSString *)incomingString error:(NSError *__autoreleasing *)err {
   if (incomingString == nil) {
     DLog(@"String was null! See? : %@", incomingString);
     NSDictionary *errorInfo = [NSDictionary dictionaryWithObject:EDEmptyStringErrorDescription forKey:NSLocalizedDescriptionKey];
     if (err != nil) *err = [NSError errorWithDomain:EDStringDomain code:EDEmptyStringError userInfo:errorInfo];
     return NO;
   }
   if (somethingElseIsWrongWithString) {
     DLog(@"Another Problem Geesh");
     NSDictionary *errorInfo = [NSDictionary dictionaryWithObject:EDAnotherStringErrorDescription forKey:NSLocalizedDescriptionKey];
     if (err != nil) *err = [NSError errorWithDomain:EDStringDomain code:EDAnotherStringError userInfo:errorInfo];
     return NO;
   }
}

これで、ヒットしたエラーが適切に確立され、最初から期待どおりにポップアップに表示されます。問題は、ユーザーが「mainMethod」を再度アクティブにするもの、または「」を呼び出す別のメソッドをクリックしたときに発生しますparseAndStoreString:error:(メソッドを呼び出すのは3つまたは4つあります)。別のエラーがある場合、ポップアップには最初のエラーと2番目のエラーの説明が1つの文字列にまとめられて表示されます。これはARCコードであるため、エラーが表示された後、コンパイラはmyErrorオブジェクト(または他のメソッドが作成しているNSErrorオブジェクト)を解放する必要があると理解しています。popupWithErrorMessageローカライズされた説明のコピーを渡すだけなので、問題は''メソッドにあるとは思いません。[popupView orderOut:self]。これらのエラーメッセージがNSErrorオブジェクトに蓄積され続ける方法についてのアイデアはありますか?

@ torrey.lyons:もちろん、togglePopupWithMessage:onView-のコードは次のとおりです。

- (void)popupWithErrorMessage:(NSString *)errorToDisplay {
   if (!messagePopup) {
      if (errorToDisplay == nil) {
         DLog(@"Warning, incoming error message was nil");
         return;
      }

      NSDictionary *messageAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSColor whiteColor], NSForegroundColorAttributeName,
                                     [NSFont systemFontOfSize:12], NSFontAttributeName,
                                     nil];
      NSAttributedString *messageWithAttributes = [[NSAttributedString alloc]
                                                  initWithString:errorToDisplay
                                                  attributes:messageAttributes];

      NSPoint messagePoint = NSMakePoint(NSMidX([[self.mainSplitView.subviews objectAtIndex:1] frame]),
                                        NSMinY([anchorView frame])+4.0f);
      messagePopup = [[MAAttachedWindow alloc] initWithView:popupView 
                                            attachedToPoint:messagePoint 
                                                   inWindow:[self window]
                                                     onSide:MAPositionBottom 
                                                 atDistance:0];
      [messagePopup setAlphaValue:0.0f];

      NSTextStorage *messageStorage = popupMessage.textStorage;
      [messageStorage beginEditing];
      [messageStorage insertAttributedString:messageWithAttributes atIndex:0];
      [messageStorage endEditing];

      [messagePopup setFrame:NSMakeRect(messagePopup.frame.origin.x, messagePopup.frame.origin.y, 250.0f, 100.0f)
                   display:YES];

      messageWithAttributes = nil;
      messageAttributes = nil;
      errorToDisplay = @"";

      [[self window] addChildWindow:messagePopup ordered:NSWindowAbove];


      [[messagePopup animator] setAlphaValue:1.0f];
      [popupMessage setNeedsDisplay:YES];

      [NSTimer scheduledTimerWithTimeInterval:3.5
                                       target:self
                                     selector:@selector(turnOffPopupFromTimer:)
                                     userInfo:nil
                                      repeats:NO];
   } else {
      [[self window] removeChildWindow:messagePopup];
      [messagePopup fadeOutAndOrderOut:YES];
      messagePopup = nil;
   }
- (void)turnOffPopupFromTimer:(NSTimer *)timer {
   if (messagePopup) {              
                                    //Added to correct problem \/\/\/\/
      NSTextStorage *messageStorage = popupMessage.textStorage;
      [messageStorage beginEditing];
      [messageStorage deleteCharactersInRange:NSMakeRange(0, messageStorage.characters.count)];
      [messageStorage endEditing];  
                                    //Added to correct problem /\/\/\/\
      [[self window] removeChildWindow:messagePopup];
      [messagePopup fadeOutAndOrderOut:YES];
      messagePopup = nil;
   }
}
4

1 に答える 1

1

問題はpopupWithErrorMessage、ローカライズされた説明を積み上げていることにあると思います。NSErrorオブジェクトのライフサイクルにバグがある場合でも、個別のエラー用に作成された各オブジェクトは個別のオブジェクトであり、他のNSErrorオブジェクトのローカライズされた説明が詰め込まれていません。一方、あなたの説明はpopupWithErrorMessage疑わしいように聞こえます[popupView orderOut:self]。画面からウィンドウを削除するだけで、ウィンドウを解放したり、破壊したりすることはありません。のコードを投稿できますpopupWithErrorMessageか?

于 2012-07-05T06:59:39.190 に答える