NaN 错误 iOS(NSUInteger 与 CGFloat)
NaN ERROR iOS (NSUInteger vs. CGFloat)
我从一个著名的教程中提取了这段代码,当我 运行 应用程序时,我在 CGFloat 实例 *imageHeight 上得到了一个 NaN 错误。但是,如果我将类型更改为 NSUInteger,应用程序构建起来就很好。有没有人可以解释发生了什么。我理解 NaN = Not A Number,但 CGFloat 应该可以作为数据类型正常工作。
崩溃
CGFloat imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);<--NaN ERROR is thrown here
不崩溃
NSUInteger imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);
完整方法体
- (void) layoutSubviews {
[super layoutSubviews];
NSUInteger imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);
CGSize sizeOfUsernameAndCaptionLabel = [self sizeOfString:self.usernameAndCaptionLabel.attributedText];
self.usernameAndCaptionLabel.frame = CGRectMake(0, CGRectGetMaxY(self.mediaImageView.frame), CGRectGetWidth(self.contentView.bounds), sizeOfUsernameAndCaptionLabel.height);
CGSize sizeOfCommentLabel = [self sizeOfString:self.commentLabel.attributedText];
self.commentLabel.frame = CGRectMake(0, CGRectGetMaxY(self.usernameAndCaptionLabel.frame), CGRectGetWidth(self.bounds), sizeOfCommentLabel.height);
// Hide the line between cells
self.separatorInset = UIEdgeInsetsMake(0, CGRectGetWidth(self.bounds)/2.0, 0, CGRectGetWidth(self.bounds)/2.0);
}
获得 NaN 的唯一可能方法是计算 0 / 0
,所以我推断 self.mediaItem.image.size
的 height
和 width
成员可能是都为零。也就是说,self.mediaImage.image.size
很可能是CGSizeZero
.
请注意,如果 self.mediaItem
为零,或者如果 self.mediaItem.image
为零,则 self.mediaItem.image.size
returns CGSizeZero
。我的猜测是其中之一是零。
你可以很容易地检查这个。要么在layoutSubviews
中打断点,要么在其顶部添加一个NSLog
:
NSLog(@"layoutSubviews: mediaItem=%p image=%p size=%@",
self.mediaItem, self.mediaItem.image,
NSStringFromCGSize(self.mediaItem.image.size));
我从一个著名的教程中提取了这段代码,当我 运行 应用程序时,我在 CGFloat 实例 *imageHeight 上得到了一个 NaN 错误。但是,如果我将类型更改为 NSUInteger,应用程序构建起来就很好。有没有人可以解释发生了什么。我理解 NaN = Not A Number,但 CGFloat 应该可以作为数据类型正常工作。
崩溃
CGFloat imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);<--NaN ERROR is thrown here
不崩溃
NSUInteger imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);
完整方法体
- (void) layoutSubviews {
[super layoutSubviews];
NSUInteger imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);
CGSize sizeOfUsernameAndCaptionLabel = [self sizeOfString:self.usernameAndCaptionLabel.attributedText];
self.usernameAndCaptionLabel.frame = CGRectMake(0, CGRectGetMaxY(self.mediaImageView.frame), CGRectGetWidth(self.contentView.bounds), sizeOfUsernameAndCaptionLabel.height);
CGSize sizeOfCommentLabel = [self sizeOfString:self.commentLabel.attributedText];
self.commentLabel.frame = CGRectMake(0, CGRectGetMaxY(self.usernameAndCaptionLabel.frame), CGRectGetWidth(self.bounds), sizeOfCommentLabel.height);
// Hide the line between cells
self.separatorInset = UIEdgeInsetsMake(0, CGRectGetWidth(self.bounds)/2.0, 0, CGRectGetWidth(self.bounds)/2.0);
}
获得 NaN 的唯一可能方法是计算 0 / 0
,所以我推断 self.mediaItem.image.size
的 height
和 width
成员可能是都为零。也就是说,self.mediaImage.image.size
很可能是CGSizeZero
.
请注意,如果 self.mediaItem
为零,或者如果 self.mediaItem.image
为零,则 self.mediaItem.image.size
returns CGSizeZero
。我的猜测是其中之一是零。
你可以很容易地检查这个。要么在layoutSubviews
中打断点,要么在其顶部添加一个NSLog
:
NSLog(@"layoutSubviews: mediaItem=%p image=%p size=%@",
self.mediaItem, self.mediaItem.image,
NSStringFromCGSize(self.mediaItem.image.size));