Используя объекты, которые я не выделил или не инициализировал - PullRequest
0 голосов
/ 08 ноября 2011

Я только что написал код. У меня есть мой собственный класс на заказ. В этом пользовательском классе под названием 'WonderfulNumbers' у меня есть метод, который выглядит следующим образом

- (NSString *)storedNumberAsString {
NSString *stringToReturn = [[NSString alloc]initWithFormat:@"Hello World"];
return [stringToReturn autorelease];
}

Я, очевидно, затем #import "WonderfulNumbers" в основной и т. Д. тогда в моем основном у меня есть IBAction. это читается как следующее

-(IBAction)displaySomeText:(id)sender {
    WonderfulNumbers *myNumber = [[WonderfulNumbers  alloc]init];// Step 1
    NSString *numberString = [myNumber storedNumberAsString];// Step 2
    [textView insertText:numberString];// Step 3
    //textView is a variable  of NSTextView.
    [myNumber release];// Step 4
}

Я получаю пошаговый процесс и логику этого. То, что мне нравится знать и пытаться успокоить себя, это то, что именно происходит на шаге 2.

Я понимаю шаги 1, 3 и 4.

Но на шаге 2 я создал переменную NSString с именем 'numberString', и она, очевидно, содержит объект с именем 'myNumber' с применением вышеописанного метода. Имеет смысл.

Что я хочу знать, так это то, что я никогда не выделял и не инициализировал объект 'numberString' класса NSString. Как я могу тогда использовать это. Я знаю, что не освобождаю его, поскольку он никогда не выделяется ... но я инициализировал его, просто выполнив [myNumber storeNumberAsString];

Небольшое объяснение было бы замечательно. Спасибо тем, кто отвечает.

P.S. Я знаю, что все в target-c является объектом, но только ради этого аргумента, поскольку технически «numberString» не «создается с помощью allocate и init», правильно ли называть эту переменную?

Мне кажется, я знаю разницу между ними, но просто хочу успокоиться.

Спасибо.

1 Ответ

2 голосов
/ 08 ноября 2011

Вы инициализируете NSString *stringToReturn возвращаемым значением [myNumber storedNumberAsString]. Внутри storedNumberAsString вы можете видеть, что он возвращает ссылку NSString, правильно распределенную и все, так что это нормально для использования.

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

В Objective-C принято соглашение, что если вы alloc или retain объект, или получили объект от метода, имя которого начинается с new, copy или mutableCopy, вы несете ответственность для того, чтобы выпустить это. В противном случае вы можете предположить, что он будет выпущен кем-то другим (например, позже через autorelease). Поскольку storedNumberAsString не начинается с new, copy или mutableCopy, вам не нужно его выпускать. Между тем реализация storedNumberAsString должна гарантировать, что объект, который он alloc s освобождает - в этом случае это делается путем вызова autorelease для него.

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