0

つまり、いつでも参照できるグローバル文字列変数を定義したいということです。私がそれを参照する関数は、文字列を返します。それを保存して別の関数で参照するとすぐに、次のように出力されます<CGPath 0x5bbf50>

一体何?コードは以下のとおりです。これは Titanium 用のモジュールであることに注意してください。まず、グローバル変数の定義..

@interface ComTestModule : TiModule <CBCentralManagerDelegate, CBPeripheralDelegate>
{
    NSString * teststring;
}

次の部分は、最初に文字列変数をチタンから xcode に送信する関数です。

-(void)setService:(id)args{
    ENSURE_ARG_COUNT(args, 2);
    teststring = [args objectAtIndex:0];
    NSLog(teststring);
}

NSLog の出力には、渡された実際の文字列が表示されます。ここで、文字列を再度呼び出してログに出力しようとする最後の関数..

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
        NSLog(@"---%@", teststring);
}

前に言ったように、このステップでは次のように出力されます---<CGPath 0x3ef4e0>

何が起こっているのか本当にわかりません..これをCGPathの代わりに元の文字列として返すことについての助けは素晴らしいでしょう!

4

2 に答える 2

1

他のポスターの提案は良かった。testString 変数をコピーされたプロパティにすることができます。

.h ファイル内:

@property (nonatomic, copy) NSString teststring;

そして、あなたの .m ファイルで

@synthesize teststring;

次に、割り当てるときに、次のようなコードを使用します。

self.teststring = [args objectAtIndex:0];

その「ドット構文」は、インスタンス変数を直接変更するのではなく、プロパティのセッターを呼び出します。「copy」修飾子を使用してプロパティを宣言したため、setter メソッドは文字列をコピーしてからインスタンス var に格納します。

最後に、このコードを dealloc メソッドに追加します。

self.teststring = nil;

また、setter メソッドは、新しい値を割り当てる前にプロパティ内の古い値をすべて解放するため、nil に設定すると古い値が解放されます。

于 2012-05-13T16:15:27.360 に答える
1

このような効果は通常、解放されて割り当てが解除されたオブジェクトへのポインターを格納するときに発生します。次に、ランタイムは、以前に NSString インスタンスを保持していたメモリのチャンクを、この特定のケースでは CGPath インスタンスに置き換えます。

NSString を存続させたい場合は、その所有権を取得する必要があります。これを行うには、それを保持するか、コピーします。文字列について話すときは、コピーが推奨される方法なので、次の行を置き換えてみてください。

teststring = [args objectAtIndex:0];

これとともに:

teststring = [[args objectAtIndex:0] copy];

完了したら、必ずリリースしてください。

于 2012-05-10T16:12:22.447 に答える