В Objective C каждый класс пользователя расширяет NSObject по умолчанию? - PullRequest
2 голосов
/ 27 сентября 2011

Пока изучаю книгу по программированию на Objective C.Я заметил этот код

@interface Fraction: NSObject
{
   int  numerator;
   int  denominator;
}

-(void)   print;
-(void)   setNumerator: (int) n;
-(void)   setDenominator: (int) d;

@end

Автор делает большую работу по объяснению каждой вещи в этой книге, но нет никакого упоминания о том, является ли это просто

 @interface Fraction
    {
       int  numerator;
       int  denominator;
    }

    -(void)   print;
    -(void)   setNumerator: (int) n;
    -(void)   setDenominator: (int) d;

    @end

причина IЯ задаю этот довольно простой вопрос, что в JAVA каждая вещь по умолчанию расширяет Object, и вам не нужно это говорить.Конечно, это два совершенно разных языка, но это был естественный вопрос, который мне пришёл в голову.

Ответы [ 4 ]

5 голосов
/ 27 сентября 2011

Нет, два примера не совпадают. @interface Fraction создает новый корневой класс, который вообще не связан с иерархией NSObject. Таким образом, он даже не будет отвечать на +alloc; Вы должны будете реализовать свой собственный метод распределения. Вы почти никогда не хотите этого делать.

4 голосов
/ 27 сентября 2011

Они не одинаковы.Во втором примере вы определяете класс, который не является производным от другого класса и, таким образом, является корневым классом (например, NSObject или NSProxy).Вы почти никогда не хотите создавать корневой класс самостоятельно (кроме случаев, когда вы 1337 h4x0r и действительно очень хорошо знаете, что вы делаете и почему).

Причина, по которой вы не хотите создавать свой собственныйКорневой класс - это то, что вам придется заново реализовать множество вещей, которые NSObject дает вам, например respondsToSelector: или performSelectorInBackground:withObject: или даже retain, release и autorelease.

1 голос
/ 27 сентября 2011

Создайте 2 класса, ChildObject, который расширяет NSObject и OrphanObjects без родительского класса.

@interface ChildObject : NSObject

@end

@interface OrphanObject

@end

Теперь попробуйте переопределить - (id) init; способ.

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

Для класса ChildObject все будет работать нормально. Для класса OrphanObject компилятор не позволит вам вызвать [super init], потому что нет «супер» класса. Это означает, что вы должны указать компилятору, что вы хотите расширить NSObject.

0 голосов
/ 27 сентября 2011

Необходимо явно объявить суперкласс, включая NSObject.Каждый класс не должен быть подклассом NSObject, но отсутствие подкласса NSObject встречается редко.

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