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

当您存储指向已释放和解除分配的对象的指针时,通常会发生这样的效果。然后,运行时将用 CGPath 实例替换之前保存 NSString 实例的那块内存。

如果你想确保你的 NSString 保持活跃,你需要拥有它。您可以通过保留它或复制它来做到这一点。在谈论字符串时,复制是首选方法,因此请尝试替换此行:

teststring = [args objectAtIndex:0];

有了这个:

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

现在只需确保在完成后释放它。

于 2012-05-10T16:12:22.447 回答
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 回答