Зачем проверять, является ли ваш popoverController нулевым? Разве Obj-C не игнорирует сообщения на ноль? - PullRequest
1 голос
/ 01 июня 2010

В значительной степени каждый, кто пишет о UISplitView на iPad , использует следующую структуру кода для отклонения всплывающего окна:

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

Я, хотя Objective-C был рад игнорировать сообщения, которые передаются в ноль? Фактически, в файле> Новый проект> Новый шаблон приложения с разделенным видом есть пример этого ярлыка в том же блоке кода (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 ]

4 голосов
/ 01 июня 2010

В данном случае это не важно и просто добавляет строку кода.

Однако, когда тип возвращаемого значения метода не является целочисленным, эта проверка может быть важной. Блин, кажется, они исправили это в 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, к счастью, memset имеет -1 s в каждом поле (кроме двойного, который я не совсем знаю, что он делает). Сообщения 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 не определено.

3 голосов
/ 01 июня 2010

Это не обязательно. Подайте ошибку.

1 голос
/ 01 июня 2010

Короче говоря, это не так. Я думаю, что некоторые люди любят быть явными ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...