Нужно ли создавать новый экземпляр объекта каждый раз, когда я добавляю его в очередь или стек? Objective-C - PullRequest
0 голосов
/ 28 января 2012

У меня возникли проблемы при добавлении серии объектов char * в очередь (CHCircularBufferQueue). Очередь принимает объект в качестве входных данных (насколько я понимаю), поэтому я создал простой объект, унаследованный от NSObject, с именем tokenObject, который просто содержит char * tokenName. Каждый раз, когда я добавляю новый объект tokenObject в очередь, я выделяю новый объект tokenObject и затем передаю этот новый объект в очередь при следующем добавлении в очередь. Однако когда я устанавливаю tokenObject.tokenName в новую строку char *, он переопределяет ВСЕ tokenObjects в очереди, поэтому при печати всей очереди я получаю серию одинаковых строк вместо уникальных строк. Что я делаю неправильно?

Это в объективе-с

Ниже приведен код из main.m & tokenObject.h main.m:

int main (int argc, const char * argv[])
{
    CHCircularBufferQueue *tokenQueue = [[CHCircularBufferQueue alloc] init];
    tokenObject *myTokenObject = [[tokenObject alloc] init];


TK currentToken;
initScanner();
scanToken();
[myTokenObject setTokenName:getToken() ];
currentToken = getTkrep();

int x=0;

while (x<5/*currentToken != TK_EOF*/) {


        //printf("line number: %d, token value: %d, token string: %s\n", getLinenumber(), getTkrep(), getToken()); /* replace line with "add to queue" */
    scanToken();
    myTokenObject.tokenName = getToken();
    [tokenQueue addObject:myTokenObject];
    myTokenObject = [[tokenObject alloc] init];
    currentToken = getTkrep();


    x = x+1;
}

while(x != 1){
    printf("%s", [[tokenQueue firstObject] tokenName]);
    [tokenQueue removeFirstObject];
    x = x-1;

    printf("%i", x);
}
return 0;

}

tokenObject.h:

@interface tokenObject : NSObject{

    char *tokenName;
}
@property (assign) char* tokenName;

@ конец

Ответы [ 2 ]

0 голосов
/ 28 января 2012

Да.Каждый член вашей очереди должен содержать уникальный объект.В противном случае вы загружаете свою очередь одним и тем же объектом снова и снова.Поэтому каждый раз, когда вы делаете myTokenObject.tokenName = getToken();, вы перезаписываете все токены во всей очереди.Если вы создаете уникальный объект для каждой позиции в очереди, каждый объект будет содержать уникальный токен.

0 голосов
/ 28 января 2012

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

Однако, в ответ на ваш вопрос, попробуйте использовать NSString * вместо char *.Ваш пользовательский объект TokenObject делает что-то кроме строки?Если это так, избегайте подклассов вообще и просто выделите / назначьте строки NSStrings напрямую и добавьте их в свою очередьВы должны найти результаты больше, чем вы ожидаете.

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