- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在写一个简单的QR code生成器(只是为了好玩和学习一些 Obj-C),我正在努力追踪连接的“模块”的轮廓(即组成 QR 码的黑色方 block )。这是为了获得更好的矢量输出,而不是简单地为每个模块制作一堆矩形。
长话短说,我的轮廓跟踪代码有效 - 但前提是我确保在特定位置调用 NSLog!如果我删除 NSLog
调用,代码就会循环!我实际上除了记录之外什么也没做。我记录什么并不重要;我只需要调用 NSLog 即可,否则就会出现问题。
追踪算法非常简单:沿着连接模块的形状顺时针移动。当你到达拐角处时,向右转,直到你回到沿着形状的轮廓。再次到达起点时停止。该形状可以有两个共享一个角点的模块。因此,跟踪循环将两次触及该点。这是预期的,并且代码可以正确处理它 - if 我调用 NSLog
。
否则,代码第一次看到某个点时会说它是角点,而第二次看到它时不是,这会导致跟踪循环。检测某物是否是角点不依赖于除该点的 x 和 y 坐标以及模块对象数组之外的任何东西 - 但在跟踪过程中模块和数组都不会改变,因此给定相同的 x,您应该总是得到相同的结果。确实如此 - 如果我调用NSLog
。
没有NSLog
,坐标 - 例如(10,9) – 瞬间是角球,片刻之后 (10,9) 突然不再被识别为角球。但是使用 NSLog
调用时,(10,9) 每次都被正确地视为角点。
再说一遍:我绝对没有改变任何东西;我只是记录一些东西——任何东西!突然间它就起作用了。这就像说 2 == 2 是 true 或 false,除非我告诉它记录 2 和 2,在这种情况下 2 == 2 总是 true,因为它应该是这样。
这是不稳定的代码。脱离上下文很难理解,但是有很多上下文,所以我希望这已经足够了。一切都是整数(没有模糊浮点值)。
do { // start going around the shape
// If this isn't here or simply commented out, the code loops.
NSLog(@"foobar"); // doesn't matter what I log - I just need to log something
// Branch: Is current x,y a corner-point? This should
// always return the same result given the same X and Y
// values, but it only does if NSLog is there!
if( [self cornerAtX:x Y:y] ) {
// add the point to the path
[path addPoint:NSMakePoint(x, y)];
// rotate the direction clockwise, until
// the direction is following the edge of the
// the shape again.
do {
dt = dx;
dx = -dy;
dy = dt;
} while( ![self boundaryFromX:x Y:y inDirectionX:dx Y:dy] );
}
// continue along direction
x += dx;
y += dy;
} while( !(sx == x && sy == y) ); // we're back to the start of the shape, so stop
如果有人能告诉我为什么 NSLog 可以使代码工作(或者更确切地说:为什么不使用 NSLog 会使工作代码中断),我会很高兴听到它!我希望有人能理解它。
最佳答案
确保cornerAtX:Y:
总是返回一些东西,即没有任何代码路径无法返回值。
否则,它很可能“返回”您调用的最后一个函数返回的任何内容,在这种情况下调用 NSLog
(它不返回值,但最终可能调用一个返回值的函数)导致它“返回”不同的东西,这可能总是被认为是真的。
如果您未能从您声明的函数或方法返回值,编译器应该警告您。你应该听听它。 Turn on all the warnings you can get away with and fix all of them.
您还应该打开静态分析器(也包含在该帖子中),因为它也可能会告诉您有关此错误的信息,如果确实如此,它会逐步告诉您它是如何发生的。
关于objective-c - 仅当我 NSLog 某些值时,代码才有效 - 但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4242942/
我是一名优秀的程序员,十分优秀!