Основной вопрос с указателем на Objective-C - PullRequest
3 голосов
/ 17 октября 2010
#import <Foundation/Foundation.h>

BOOL areIntsDifferent( int thing1, int thing2 ) {
    if (thing1 == thing2) {
        return (NO);
    } else {
        return (YES);
    }
}

NSString *boolString (BOOL yesNo) {
    if (yesNo == NO) {
        return( @"NO" );
    } else {
        return( @"YES" );
    }
}

int main (int argc, const char * argv[]) {
    BOOL areTheyDifferent;

    areTheyDifferent = areIntsDifferent (5,5);

    NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent));

    areTheyDifferent = areIntsDifferent (23,42);

    NSLog(@"are %d and %d different? %@", 23, 42, boolString(areTheyDifferent));

    return (0);
}

Это вся программа.Это не очень сложно, но освещает общую проблему, с которой я постоянно сталкиваюсь - понимание указателей.В этой ситуации, является ли возвращаемое значение функции boolString указателем, потому что не выделена память для хранения строки?И если так, то почему возвращаемое значение areIntsDifferent не является указателем на значение BOOL?Могу ли я переписать эту программу так, чтобы возвращаемое значение boolString было строкой, а не указателем на строку?Если так, то КАК?Я попытался устранить *, но затем я получил ошибку компилятора.

Ответы [ 2 ]

4 голосов
/ 17 октября 2010

NSString - это объект. В Obj-C объекты всегда передаются по указателю, а не путем копирования их фактической памяти.

BOOL - это примитив. В отличие от объектов, примитивы передаются по значению.

Одной из причин этой дихотомии является то, что примитивы маленькие, но объекты могут быть очень большими (например, UIImage), поэтому передача объектов по значению будет тратить много памяти. Другая причина заключается в том, что передача объектов по указателю позволяет коллекциям хранить объекты различных типов. Например. NSArray может содержать UIImage прямо рядом с NSString и NSNumber. Apple легко это реализует, потому что все указатели имеют одинаковое количество байтов в памяти. Если бы объекты обрабатывались по значению, а не по указателю, смешивание типов в коллекции было бы очень сложным, поскольку у вас были бы элементы разных размеров, а не указатели одинакового размера.

2 голосов
/ 17 октября 2010

При работе с экземплярами объектов Objective-C вы всегда будете иметь дело только с указателями, которые ссылаются на экземпляр.

В свете этого факта ...

Является ливозвращаемое значение функции boolString указатель, потому что нет памяти, выделенной для хранения строки?

В случае вашей boolString функции литералы @"YES" и @"NO" фактически приводят к экземплярамобъектов, которые могут быть возвращены как указатели на объекты NSString.Учитывая приведенный выше комментарий о том, что экземпляры можно использовать только через указатели, он возвращает NSString*, потому что это то, чем являются @"YES" и @"NO", и является единственным способом, которым он МОЖЕТ вернуть строку.

Почему возвращаемое значение areIntsDifferent не является указателем на значение BOOL?

BOOL является типом значения и поэтому может быть возвращено непосредственно из методов / функций и передано непосредственно в качестве параметров.

Могу ли я переписать эту программу так, чтобы возвращаемое значение boolString было строкой, а не указателем на строку?

Нет, по причинам, уже указанным в отношении Objective-Объекты С.

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