2010-04-02 3 views
0

От источника наблюдения источника.Смысл уведомления Источник источника наблюдения-c

- (void)selectNotification:(NSNotification*)aNotification { 
id sender = [aNotification object]; 
[selectedDistNotification release]; 
selectedDistNotification = nil; 
[selectedWSNotification release]; 
selectedWSNotification = nil; 
NSNotification **targetVar; 
NSArray **targetList; 
if (sender == distNotificationList) { 
    targetVar = &selectedDistNotification; 
    targetList = &distNotifications; 
} else { 
    targetVar = &selectedWSNotification; 
    targetList = &wsNotifications; 
} 
if ([sender selectedRow] != -1) { 
    [*targetVar autorelease]; 
    *targetVar = [[*targetList objectAtIndex:[sender selectedRow]] retain]; 
} 
if (*targetVar == nil) { 
    [objectText setStringValue:@""]; 
} else { 
    id obj = [*targetVar object]; 
    NSMutableAttributedString *objStr = nil; 
    if (obj == nil) { 
     NSFont *aFont = [objectText font]; 
     NSDictionary *attrDict = italicAttributesForFont(aFont); 
     objStr = [[NSMutableAttributedString alloc] initWithString:@"(null)" 
                 attributes:attrDict]; 
    } else { 
/* Line 1 */  objStr = [[NSMutableAttributedString alloc] initWithString: 
        [NSString stringWithFormat:@" (%@)", [obj className]]]; 
     [objStr addAttributes:italicAttributesForFont([objectText font]) 
         range:NSMakeRange(1,[[obj className] length]+2)]; 
     if ([obj isKindOfClass:[NSString class]]) { 
      [objStr replaceCharactersInRange:NSMakeRange(0,0) withString:obj]; 
     } else if ([obj respondsToSelector:@selector(stringValue)]) { 
      [objStr replaceCharactersInRange:NSMakeRange(0,0) 
            withString:[obj performSelector:@selector(stringValue)]]; 
     } else { 
      // Remove the space since we have no value to display 
      [objStr replaceCharactersInRange:NSMakeRange(0,1) withString:@""]; 
     } 
    } 
    [objectText setObjectValue:objStr]; 
/* LINE 2 */ [objStr release]; 
} 
[userInfoList reloadData]; 

}

Over в // ЛИНИЯ 2 objStr выпускается. Это потому, что мы назначаем его с помощью alloc в // LINE 1?

Кроме того, почему // ЛИНИЯ 1: не

objStr = [NSMutableAttributedString* initWithString:@"(null)" 
                attributes:attrDict] 

Если я создаю новую строку, как

(NSString*) str = [NSString initWithString:@"test"]; 
... 
str = @"another string"; 

бы я должен освободить ул, или это не так, и если я что я должен использовать [[NSString alloc] initWithString: @ "test"]? Почему символ указателя не используется, как в [[NSString * alloc] ...?

Thanks

+0

Извините, пожалуйста, проигнорируйте последний вопрос: «Почему символ указателя не используется, как в [[NSString * alloc] ...?»? Я не знаю, откуда у меня эта идея ... – Chris

ответ

0

Это освобождение, потому что оно было выделено. alloc имеет значение retain и должен быть сбалансирован с помощью release (или autorelease). Практически любой метод, начинающийся с init, приводит к тому, что объект должен быть выпущен. Речь идет о балансировании сохранений с релизами.

+0

Есть ли способ создать объект без его выпуска? – Chris

+0

Нет, нет автоматической сборки мусора, как в Java или .NET. Вы должны указать время выполнения, когда вы закончите с объектом. Использование autorelease как можно ближе, но если объект долговечен, вам нужно его сохранить. Вышеприведенный код мог использовать autorelease. – ongle

Смежные вопросы