キュー(CHCircularBufferQueue)に一連のchar *オブジェクトを追加する際に問題があります。キューはオブジェクトを入力として受け取ります(私が理解する限り)ので、単純にchar * tokenNameを含むtokenObjectというNSObjectから継承された単純なオブジェクトを作成しました。キューに新しいtokenObjectを追加するたびに、新しいtokenObjectを割り当ててから、次回キューに追加するときに新しいトークンをキューに渡します。しかし、tokenObject.tokenNameを新しいchar *文字列に設定すると、QueueのすべてのtokenObjectがオーバーライドされるため、Queue全体を印刷すると、一意の文字列ではなく同じ文字列が返されます。私は間違って何をしていますか?オブジェクトの新しいインスタンスは、キューまたはスタックに追加するたびに作成する必要がありますか? Objective-C
このObjective-Cで以下
が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;
@end
何かを追加するたびに新しいオブジェクトを作成する必要はありませんが、カスタムオブジェクトにtokenNameポインタが1つしかないため、別のオブジェクトが必要です。 (なぜNSStringオブジェクトを追加するだけでいいですか?) –
'getToken'は何をするのですか?あなたが解放する責任を負っている、新しく割り当てられた文字列を返しますか、それとも内部的に保持して変更する可能性のある文字列ですか?つまり、NSStringを使用していない理由については、Second Licksの質問にも言います。 – nil
自分自身をサブクラス化する代わりにNSStringを実装しようとしていますが、それをどのように実装すればよいでしょうか? getToken()はchar *を返し、私の教授から提供されたので、コードのその部分を変更することはできません。 NSStringのセッター機能は何ですか? – kabirpong