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

时间:2010-05-31 20:52:01

标签: objective-c ipad

非常everyone that writes about the UISplitView on the iPad使用以下代码结构来解除弹出窗口:

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 个答案:

答案 0 :(得分:4)

在这种情况下,它并不重要,只需添加一行代码。

但是,当方法的返回类型不是整数类型时,此检查可能很重要。哦,废话,似乎他们在ObjC 2.0中解决了这个问题。

在返回非标量类型时检查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个(除了double,我不太清楚它是做什么的)。消息nil确实将所有内容重置为零。

但是等等!

假设我们稍微更改了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);
}

现在,c将保留[[[Foo alloc] init] complex]返回的内容,即使返回值在技术上未被使用。 (编辑gcc -lobjc -framework Cocoa编译为x86_64二进制文件。您的里程可能会因您的体系结构而异。)

当消息struct未定义时,似乎是大nil的返回值。

答案 1 :(得分:3)

没有必要。提交错误。

答案 2 :(得分:1)

简而言之,事实并非如此。我猜有些人喜欢明白......?