Странное поведение NSString в NSView - PullRequest
1 голос
/ 18 мая 2010

Пытаясь создать Skat-Game, я столкнулся со следующей проблемой:

isBidding - это логическое значение g, программа находится в определенном состоянии, [desk selected] - это метод, вызывающий возвращение текущего выбранного игрока, chatStrings состоит из словарей, сохраняющих строки с игроком, который набрал, и что он набрал

- (void)drawRect:(NSRect)rect{

    NSMutableDictionary * attributes = [NSMutableDictionary dictionary];

    [attributes setObject:[NSFont fontWithName:playerFont size:playerFontSize] forKey:NSFontAttributeName];
    [attributes setObject:playerFontColor forKey:NSForegroundColorAttributeName];


    [[NSString stringWithFormat:@"Player %i",[desk selected] + 1] drawInRect:playerStringRect withAttributes:attributes];

    if (isBidding){
        [attributes setObject:[NSFont fontWithName:chatFont size:chatFontSize] forKey:NSFontAttributeName];
        [attributes setObject:chatFontColor forKey:NSForegroundColorAttributeName];

        int i;
        for (i = 0; i < [chatStrings count]; i++, yProgress -= 20){
            if (isBidding)
                [[NSString stringWithFormat:@"Player %i bids: %@",
                    [[[chatStrings objectAtIndex:i]valueForKey:@"Player"]intValue],
                    [[chatStrings objectAtIndex:i]valueForKey:@"String"]],
                        drawAtPoint:NSMakePoint([self bounds].origin.x, yProgress) withAttributes:attributes];   
            else
                [[NSString stringWithFormat:@"Player %i: %@",[[[chatStrings objectAtIndex:i] valueForKey:@"Player"]intValue],
                [[chatStrings objectAtIndex:i]valueForKey:@"String"]]
                    drawAtPoint:NSMakePoint([self bounds].origin.x, yProgress) withAttributes:attributes];

        }   
    }

    if (isBidding)
        [[NSString stringWithFormat:@"Player %i bids: %@",[desk selected] + 1, displayString]
            drawAtPoint:NSMakePoint([self bounds].origin.x, yProgress) withAttributes:attributes];
    else
        [[NSString stringWithFormat:@"Player %i: %@",[desk selected] + 1, displayString]
            drawAtPoint:NSMakePoint([self bounds].origin.x, yProgress) withAttributes:attributes];

    yProgress = chatFontBegin;
}

Это часть, определяющая содержимое строки, строка добавляется методом [символы символов].

-(void)displayChatString:(NSString *)string{
     displayString = [displayString stringByAppendingString:string];
     [self setNeedsDisplay:YES];
 }

Проблема, если есть это:

при вводе более двух букв представление отображает NSRectSet {{{471, 574}, {500, 192}}} и не возвращает больше описания, когда я пытаюсь его распечатать.

затем я получаю сообщение EXC_BAD_ACCESS, хотя я не выпустил его (насколько я вижу), я также создал строку с помощью alloc и init, так что я не могу быть в пуле автоматического выпуска. Я также пытался наблюдать за процессом, когда он меняется, с помощью отладчика, но я не смог найти ответственный код.

Как вы видите, я все еще новичок в Какао (и программировании в целом), поэтому я был бы очень рад, если бы кто-нибудь помог мне с этим.

Ответы [ 2 ]

1 голос
/ 18 января 2011

Этот код содержит ошибки:

-(void)displayChatString:(NSString *)string{
     displayString = [displayString stringByAppendingString:string];
     [self setNeedsDisplay:YES];
 }

stringByAppendingString: возвращает объект autorelease d. Вам нужно retain или copy, если хотите, чтобы оно оставалось (возможно, с помощью свойства copy ing / retain ing, такого как self.displayString = [displayString stringByAppendingString:string]; и соответствующего объявления свойства / synth.

Итак, в данный момент вы присваиваете объект, который будет освобожден, но позже вы получите к нему доступ, сообщив об ошибке.

0 голосов
/ 19 мая 2010

Я не могу разгадать твой код, но могу рассказать кое-что о странном возвращении.

NSRectSet - это закрытый тип внутри платформы Foundation. Вы никогда не должны видеть это. Он используется внутри IIRC для представления вложенных прямоугольников, таких как стеки видов.

Вы либо получаете странную проблему с памятью, из-за которой указатель строки фактически указывает на NSRectSet, либо вы испортили вложение вашего метода, и вы присваиваете значение NSRectSet строке.

...