4

我第一次使用静态分析器并且很难找出箭头。在查看了一些关于 SO 的类似问题后,我认为问题在于 CGSize 大小为 nil 值,但我不完全确定它是如何工作的。

这是代码:

 - (void)keyboardDidShow:(NSNotification*)notification {
    CGSize size = CGSizeMake(0, 0);
    size = [self keyboardSize:notification];
      if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
            detailTableView.frame = CGRectMake(detailTableView.frame.origin.x, detailTableView.frame.origin.y,
                                       detailTableView.frame.size.width, kTableViewMovableHeight + kTableViewDefaultHeight -  size.height
                                       );
    //detailTableView.scrollEnabled = YES;
    }
}


- (CGSize)keyboardSize:(NSNotification *)aNotification {
NSDictionary *info = [aNotification userInfo];
NSValue *beginValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
CGSize keyboardSize;
UIDeviceOrientation _screenOrientation = orientation;
if ([UIKeyboardDidShowNotification isEqualToString:[aNotification name]]) {
    if (UIDeviceOrientationIsPortrait(orientation)) {
        keyboardSize = [beginValue CGRectValue].size;
    } else {
        keyboardSize.height = [beginValue CGRectValue].size.width;
        keyboardSize.width = [beginValue CGRectValue].size.height;
    }
} else if ([UIKeyboardWillHideNotification isEqualToString:[aNotification name]]) {
    if (_screenOrientation == orientation) {
        if (UIDeviceOrientationIsPortrait(orientation)) {
            keyboardSize = [beginValue CGRectValue].size;
        } else {
            keyboardSize.height = [beginValue CGRectValue].size.width;
            keyboardSize.width = [beginValue CGRectValue].size.height;
        }
        // rotated
    } else if (UIDeviceOrientationIsPortrait(orientation)) {
        keyboardSize.height = [beginValue CGRectValue].size.width;
        keyboardSize.width = [beginValue CGRectValue].size.height;
    } else {
        keyboardSize = [beginValue CGRectValue].size;
    }
}
return keyboardSize;
}

在此处输入图像描述

4

2 回答 2

6
  1. CGSize 是一个 C 结构
  2. [self keyboardSize:notification]可能返回零

声明 C 结构时,其值具有垃圾值。也就是说,之前那段记忆中的内容。如果您的调用keyboardSize返回 uninitialized CGSize,则该 C 结构将具有所谓的“垃圾值”。

现在我看到了 CGSize 的实现,将keyboardSize方法中的变量 keyboardSize 的声明更改为:

CGSize keyboardSize = CGSizeMake(0, 0);
于 2013-02-06T21:01:29.843 回答
1

您缺少 else 条件。

if ([UIKeyboardDidShowNotification isEqualToString:[aNotification name]]) {
    // ...
} else if ([UIKeyboardWillHideNotification isEqualToString:[aNotification name]]) {
    // ...
}
// else not handled could result in keyboardSize not being set.
return keyboardSize;

您可以通过处理缺少的 else 条件或初始化 keyboardSize 来解决此问题。

CGSize keyboardSize = CGSizeZero;
于 2013-02-06T21:21:43.613 回答