为什么我的NSString成为CGPath? Xcode,Titanium

时间:2012-05-10 15:47:56

标签: objective-c xcode nsstring titanium cgpath

所以缺点是我想定义一个我可以随时引用的全局字符串变量。我引用它的函数,它返回一个字符串。只要我将其存储并在另一个函数中引用它,它就会输出为<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会很棒!

2 个答案:

答案 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会释放旧值。