我目前正在开发蓝牙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并将其他内容保留时(因为它们仍为空,并且稍后将成为一次迭代的值)。
答案 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(开源,由我制作))