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.