Разберитесь с источником-наблюдателем уведомлений - PullRequest
0 голосов
/ 03 апреля 2010

Из источника наблюдателя уведомлений.

- (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 at // LINE 2 Выпускается objStr. Это потому, что мы присваиваем его с помощью alloc в // LINE 1?

Кроме того, почему // LINE 1 не:

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

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

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

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

Спасибо

1 Ответ

0 голосов
/ 03 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...