非常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
}
}
为什么在必要时才是第二个?
答案 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)
简而言之,事实并非如此。我猜有些人喜欢明白......?