Как определить возвращающую функцию NSString в Objective-C / Xcode, используя временную переменную? - PullRequest
3 голосов
/ 20 марта 2011

Я хотел бы определить следующую функцию в Objective-C.Я предоставил псевдокод, чтобы проиллюстрировать, что я пытаюсь сделать.

PSEUDOCODE:

function Foo(param) {
  string temp; 

if(param == 1) then
  temp = "x";
else if(param == 2) then
  temp = "y";
else if(param == 3) then 
  temp = "z";
else
  temp = "default";
end if    

  return temp;
}

По какой-то причине, если я сделаю это ... переменная, которую я назначаюк результатам «BAD Access» ошибка.

Я не знаю, в чем разница между:

static NSstring *xx;

или нестатическим:

NSString *xx;

декларации, и как или почему я хотел бы использовать один над другим.

Я также не до конца понимаю инициализаторы NSString и то, как они отличаются.Например:

[[NSString alloc] initWithString:@"etc etc" ];

или простое задание:

var = @""

или даже:

var = [NSString stringWithString:@"etc etc"];

Не могли бы вы мне помочь, пожалуйста?

Пока что использование значения NSString, возвращаемого функциями, подобными перечисленным выше, всегда вызывает ошибку.

Ответы [ 3 ]

8 голосов
/ 20 марта 2011

Вы можете сделать это следующим образом:

- (NSString *)functionName:(int)param {
    NSString *result = nil;

    switch (param) {
        case 1:
            result = [NSString stringWithString:@"x"];
            break;
        case 2:
            result = [NSString stringWithString:@"y"];
            break;
        case 3:
            result = [NSString stringWithString:@"z"];
            break;
        default:
            result = [NSString stringWithString:@"defaultv"];
            break;
    }

    return result;
}
8 голосов
/ 20 марта 2011
static NSstring *xx;

Это объявляет статически распределенную переменную, так же как и в C.

NSstring *xx;

Внутри метода, который объявляет обычную локальную переменную стека, как в C.

Как вы должны знать, различие между ними заключается в том, что первый будет сохранять свое значение между вызовами функции (и может вызвать проблемы, если функция вызывается из нескольких потоков).

[[NSString alloc] initWithString:@"etc etc"]

Создает новый объект NSString с содержимым etc etc. Это может быть, а может и не совпадать с любым другим объектом NSString в вашей программе с тем же содержимым, но вам это не нужно. Если вы управляете памятью, вы владеете ею, поэтому несете ответственность за то, чтобы в конечном итоге вы вызывали release или autorelease, чтобы избежать утечки памяти.

@"etc etc"
[NSString stringWithString:@"etc etc"]

Это в основном то же самое. Оба дают вам объект NSString с содержимым etc etc. Это может быть, а может и не совпадать с любым другим объектом NSString в вашей программе с тем же содержимым, но вам это не нужно. В отношении управления памятью вы не являетесь ее владельцем, поэтому вы должны , а не , вызывать release или autorelease на объекте, если вы сначала не вступили во владение, вызвав retain. Кроме того, поскольку вы не являетесь его владельцем, вы можете использовать его в своем методе, передать его в качестве параметра другим методам и даже использовать в качестве возвращаемого значения из вашего метода, но вы не можете хранить его в переменной ivar или static. не вступая во владение, позвонив по номеру retain или сделав копию (с copy).

Также обратите внимание, что "" и @"" очень разные. Первый дает вам const char * точно так же, как в C, а второй дает вам объект NSString. Ваша программа будет аварийно завершать работу, если вы используете const char *, где код ожидает объект NSString.

2 голосов
/ 20 марта 2011

Размещайте реальный код, а не псевдокод, поскольку вам будет намного проще ответить на ваш вопрос в конкретных терминах.

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

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