所以缺点是我想定义一个我可以随时引用的全局字符串变量。我引用它的函数,它返回一个字符串。只要我将其存储并在另一个函数中引用它,它就会输出为<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会很棒!
答案 0 :(得分:1)
当您存储指向已释放和取消分配的对象的指针时,通常会发生这样的效果。然后,运行时将替换以前持有NSString实例的那块内存,在这种特殊情况下,它是一个CGPath实例。
如果您想确保您的NSString保持活力,您需要拥有它。您可以通过保留或复制它来实现。在讨论字符串时,复制是首选方法,因此请尝试替换此行:
teststring = [args objectAtIndex:0];
有了这个:
teststring = [[args objectAtIndex:0] copy];
现在确保在完成后释放它。
答案 1 :(得分:1)
另一张海报的建议很好。您可能希望将testString变量设置为复制的属性:
在你的.h文件中:
@property (nonatomic, copy) NSString teststring;
在你的.m文件中
@synthesize teststring;
然后当你分配给它时,使用这样的代码:
self.teststring = [args objectAtIndex:0];
“点语法”调用属性的setter,而不是直接更改实例变量。由于您使用“复制”限定符声明了属性,因此setter方法会在将字符串放入实例var之前复制该字符串。
最后,您可以将此代码添加到dealloc方法中:
self.teststring = nil;
setter方法在分配新值之前还会释放属性中的任何旧值,因此将其设置为nil会释放旧值。