NSLog在第三个变量后停止打印

时间:2014-05-14 09:14:14

标签: ios objective-c nslog

我目前正在开发蓝牙LowEnergy应用程序,我希望使用NSLog打印收集到的信息。

这是我在didUpdateValueForCharacteristic方法结束时使用的代码,当所有属性都已更新时(调试器确认):

NSLog(@"These are the information I found! %huBPM Position:%@ Hersteller:%@ ", self.heartRate, self.bodySensorLocation, self.manufacturerName);
NSLog(@"Modell:%@ SerialNumber:%@ Batterie:%@", self.modelNumber, self.serialNumber, self.batteryLevel);

这些属性实际上只是标准:

@property (nonatomic, strong) NSString *manufacturerName;
@property (nonatomic, strong) NSString *modelNumber;
@property (nonatomic, strong) NSString *serialNumber;
@property (nonatomic, strong) NSString *batteryLevel;
@property (nonatomic, strong) NSString *bodySensorLocation;
@property (assign) uint16_t heartRate;

NSLog输出的内容如下:

2014-05-14 11:04:16.888 PulseSense[24493:60b] These are the information I found! 77BPM Position:Chest Hersteller:Polar Electro Oy
2014-05-14 11:04:16.889 PulseSense[24493:60b] SerialNumber:1312082746

我不禁自己为什么不打印SerialNumber:self.serialNumber和Batterie:self.batteryLevel。我以前在一行中都有过两个NSLog命令,但这里发生了同样的事情。打印完第三个属性后我被剪掉了(所以甚至缺少SerialNumber)。

有什么想法吗?

编辑1: 所以我做了一些测试,发生的事情是Modell,SerialNumber和Batterie都是第一次执行我的NSLog语句时都为空。当最后第一个String Modell变为实数值(“H7”)时,这将保留前几次迭代。这是第一次当NSLog只打印Modell并将其他内容保留时(因为它们仍为空,并且稍后将成为一次迭代的值)。

3 个答案:

答案 0 :(得分:1)

NSString个对象包含nil个字节(\0)时,我已经看到过这种行为。这是一个说明问题的测试程序:

#import <Foundation/Foundation.h>

int main() {
    NSString *a = @"aa\0a";
    NSString *b = @"bbb";
    NSLog(@"a: %@, b: %@, end.", a, b);
}

运行上述程序:

$ clang -framework Foundation test.m -o test && ./test
2014-05-14 13:11:52.912 test[17814:507] a: aa

因此,请确保从BT通信通道获取的字符串值不包含nil字节。如果是您正在使用NSMutableData作为缓冲区,在尝试将其解码为NSString之前,从中删除所有nil个字节。

答案 1 :(得分:0)

确保第三项包含要打印的有效值,而不仅仅是该对象中的nil

答案 2 :(得分:0)

为什么NSLog语句跳过“Modell”然后打印“SerialNumber”?我认为日志消息来自不同的地方。

要解决此问题,您应该在两个NSLog行上放置一个断点并单步执行它们。然后,将发生以下两种情况之一:断点不会停止程序,因为日志输出来自不同的地方。或者,断点停止,当你单步执行它时,它就可以正常工作。

让我举个例子

// part 1 source
NSLog(@"These are the information I found! %huBPM Position:%@ Hersteller:%@ ", self.heartRate, self.bodySensorLocation, self.manufacturerName);
NSLog(@"SerialNumber:%@", self.serialNumber);

...

// part 2 source
NSLog(@"These are the information I found! %huBPM Position:%@ Hersteller:%@ ", self.heartRate, self.bodySensorLocation, self.manufacturerName);
NSLog(@"Modell:%@ SerialNumber:%@ Batterie:%@", self.modelNumber, self.serialNumber, self.batteryLevel);

这给出了以下输出

// part 1 output
2014-05-14 11:04:16.888 PulseSense[24493:60b] These are the information I found! 77BPM Position:Chest Hersteller:Polar Electro Oy
2014-05-14 11:04:16.889 PulseSense[24493:60b] SerialNumber:1312082746

...

// part 2 output
2014-05-14 11:04:16.888 PulseSense[24493:60b] These are the information I found! 77BPM Position:Chest Hersteller:Polar Electro Oy
2014-05-14 11:04:16.889 PulseSense[24493:60b] Modell:Audi SerialNumber:1312082746 Batterie:LiIon

当您查看“第2部分来源”并将其与“第1部分输出”进行比较时,它似乎无法正常工作。这可能更糟,可能从未执行过“第2部分来源”。

NSLog的潜在问题只是您永远无法确定消息的来源。仅仅因为您在源中看到NSLog(@"hello");,并且日志显示hello,并不意味着您看到的NSLog行是产生日志输出的行。源中可以有多个位置NSLog(@"hello"),其中只有一个产生输出。

要解决此问题,您可以使用日志框架来告诉您正在创建的日志条目的文件名和编号。 (例如MPLog(开源,由我制作))