【问题标题】:Why does my NSString becomes CGPath? Xcode, Titanium为什么我的 NSString 变成了 CGPath? Xcode,钛
【发布时间】:2012-05-10 15:47:56
【问题描述】:

所以简而言之,我想定义一个可以随时引用的全局字符串变量。我引用它的函数,它返回一个字符串。一旦我存储它并在另一个函数中引用它,它就会输出为<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);
}

正如我之前所说,在这一步中它输出为---&lt;CGPath 0x3ef4e0&gt;

我真的不确定发生了什么。任何关于让它作为原始字符串而不是 CGPath 返回的任何帮助都会很棒!

【问题讨论】:

    标签: objective-c xcode nsstring titanium cgpath


    【解决方案1】:

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

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

    teststring = [args objectAtIndex:0];
    

    有了这个:

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

    现在请务必在完成后释放它。

    【讨论】:

    • 谢谢!这解决了我的问题!
    【解决方案2】:

    另一位发帖人的建议很好。您可能希望将您的 testString 变量复制到一个属性中:

    在您的 .h 文件中:

    @property (nonatomic, copy) NSString teststring;
    

    在你的 .m 文件中

    @synthesize teststring;
    

    然后当你分配给它时,使用这样的代码:

    self.teststring = [args objectAtIndex:0];
    

    “点语法”为您的属性调用 setter,而不是直接更改实例变量。由于您使用“copy”限定符声明了您的属性,因此 setter 方法会在将字符串放入实例 var 之前复制该字符串。

    最后,您可以将此代码添加到您的 dealloc 方法中:

    self.teststring = nil;
    

    setter 方法还会在分配新值之前释放属性中的任何旧值,因此将其设置为 nil 会释放旧值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多