代码之家  ›  专栏  ›  技术社区  ›  Rob Fonseca-Ensor

为什么要检查你的popoverController是否为零?Obj-C不忽略到nil的消息吗?

  •  1
  • Rob Fonseca-Ensor  · 技术社区  · 15 年前

    everyone that writes about the UISplitView on the iPad 使用以下代码结构取消popover:

    if (popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    }
    

    我认为Objective-C很乐意忽略传递给nil的消息?事实上,在文件中>新项目>新的拆分视图应用程序模板,同一代码块中有一个此快捷方式的示例(DetailsViewController.m):

    - (void)setDetailItem:(id)newDetailItem { 
        if (detailItem != newDetailItem) {
            [detailItem release];                             //might be nil
            detailItem = [newDetailItem retain]; 
    
            // Update the view.
            [self configureView];
        }
    
    
        if (popoverController != nil) {
            [popoverController dismissPopoverAnimated:YES];   //was checked for nil
        }        
    }
    

    如果必要的话为什么是第二个?

    3 回复  |  直到 15 年前
        1
  •  4
  •   zneak    15 年前

    但是,当一个方法的返回类型不是整数类型时,这个检查可能很重要。

    nil 当应返回非标量类型时。举个例子:

    struct complex_t
    {
        int foo, bar, frob;
        double nicate;
    };
    
    @interface Foo : NSObject {}
    -(struct complex_t)complex;
    @end
    
    @implementation Foo
    -(struct complex_t)complex { return (struct complex_t){-1, 2, -1, 1e14}; }
    @end
    
    int main()
    {
        struct complex_t c;
        memset(&c, 0xFFFFFFFF, sizeof c);
        c = [nil complex];
        printf("%i %i %i %g\n", c.foo, c.bar, c.frob, c.nicate);
    }
    

    c 很高兴能有 -1 每一个领域都是如此(除了替身,我不太清楚它是做什么的)。信息 事实上,一切都归零了。

    假设我们改变主意 main

    int main()
    {
        struct complex_t c;
        memset(&c, 0xFFFFFFFF, sizeof c);
        [[[Foo alloc] init] complex]; // NEW LINE HERE!
        c = [nil complex];
        printf("%i %i %i %g\n", c.foo, c.bar, c.frob, c.nicate);
    }
    

    现在碰巧 会保持什么 [[[Foo alloc] init] complex] 编辑 编译自 gcc -lobjc -framework Cocoa 作为x86\u 64二进制文件。您的里程数可能因您的体系结构而异。)

    struct 发送消息时 未定义。

        2
  •  3
  •   bbum    15 年前

        3
  •  1
  •   Dave DeLong    15 年前

    简而言之,不是这样的。我猜有些人喜欢直白。。。?