запутался насчет NSString * str - PullRequest
1 голос
/ 22 июня 2010

Меня смущает поведение NSString * str ..

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

NSString *str = @"/hi/hello"; // this one always works
// this sometimes becomes null after the function ends
NSString *str2 = [str lastPathComponent]; 
// as above
NSString *str3 = [NSString stringWithString:str2];
NSString *str4 = [NSString initWithString:str3];

Я не совсем знаком с поведением объектов Obj-C, это так же, как C ++?

Если это так, как я могу выполнить задание безопасно, как

string str = "hi";
string str2 = str;

ведет себя в C ++?

Пример: я объявляю строку в моем .h файле,

как назначить это безопасно, чтобы оно не становилось NULL после завершения функции?

Я знаю, что это очень простой вопрос, но я не могу найти ответ на справочной странице NSString.

Действительно, спасибо за любую помощь!

Ответы [ 3 ]

7 голосов
/ 22 июня 2010

Поведение не такое, как в C ++. Объекты подсчитываются по ссылкам. Если вы хотите сохранить его, вы должны предъявить претензию.

Если вы создаете объект самостоятельно с помощью метода, имя которого включает в себя слова alloc, new или copy, то у вас уже есть право собственности. Это похоже на C ++ new. (Когда вы создали объект с alloc, вам также нужно инициализировать его каким-нибудь методом, имя которого начинается с init. Но вы должны сначала создать его. В C ++ обе вещи будут считаться частями одного акта построения .)

Объекты, которые вы получаете от других методов (например, двух из трех упомянутых вами методов NSString), доступны только временно, если только вы не заявите явное право собственности, вызвав [object retain]. Вам нужно сделать это, только если вы хотите, чтобы они оставались вне непосредственного контекста. (На самом деле нет эквивалента этому в C ++.)

Однако, если вы получаете право собственности, вы должны отказаться от него, когда закончите, позвонив по номеру [object release]. Это что-то вроде C ++ delete, за исключением того, что объект на самом деле не уничтожается до тех пор, пока не будут сняты все заявки на владение.

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

2 голосов
/ 22 июня 2010
NSString *str = @"/hi/hello"; 

Это работает, потому что создает строковый литерал. Ответы на этот вопрос стоит прочитать, чтобы понять их в Objective-C

В чем разница между строковой константой и строковым литералом?

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

NSString *str2 = [str lastPathComponent]; 
NSString *str3 = [NSString stringWithString:str2];

В последнем, я полагаю, вы имели в виду [[NSString alloc] initWithString:str3]

Это создает строку, которая сохраняется. Но это не хороший способ создания статических строк. Вы должны создать статические строки в вашем файле реализации, как это

static NSString *myConstant = @"constantString"
2 голосов
/ 22 июня 2010

Я полагаю, вы не используете сборщик мусора?Если это так, то вам нужно сохранить строку.

NSString* str2 = [[str lastPathComponent] retain];

Я предлагаю вам немного прочесть об управлении памятью target-c.

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