Метод с указателем в качестве аргумента и пулом авторелиза

#objective-c

#objective-c

Вопрос:

Я нашел пул авторелиза внутри метода, передающего указатель в качестве аргумента.

1. Есть ли какая-либо связь между 2?

 - (void)exportXMLToString:(NSMutableString **)aString
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSMutableString *theString = *aString;
  

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

3. Если я хочу переопределить такой метод и вызвать из него метод суперкласса, могу ли я просто написать это? (и используется та же строка ?

  - (void)exportXMLToString:(NSMutableString **)aString
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        NSMutableString *theString = *aString;

            ...

            [super exportXMLToString:aString];
   }
  

Спасибо

Комментарии:

1. Пожалуйста, обратите внимание, что ** это указатель на указатель.

Ответ №1:

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

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

Если вы планируете вызвать метод суперкласса из своего переопределенного метода, вам не нужно добавлять другой пул авторелиза, если вы не выполняете кучу собственных авторелизов вне метода суперкласса. Он по-прежнему будет создавать и обрабатывать свой собственный пул авторелиза, как и раньше.

Комментарии:

1. Спасибо! последний вопрос: в моем коде я присваиваю строку локальному объекту theString . Если я вызову метод super после этой строки, будут ли внесены изменения как в строку, так и в строку? Другими словами, я все еще ссылаюсь на тот же объект в памяти, правильно?

2. Не обязательно. Если вы выполняете вызовы методов, предоставляемых NSMutableString , они повлияют на оба, но простое присвоение значений может не оказать ожидаемого влияния. NSString уже является указателем на объект NSString. Переданное значение является указателем на указатель на объект NSString. NSString * theString — это просто обычный указатель на строку, и вы назначаете ему указывать на ту же строку, на которую указывает указатель, на который указывает строка. Извините, я знаю, что это слишком много указаний. Дайте мне знать, если это требует дополнительных разъяснений.

3. В принципе, если вы измените, на что указывает строка, это изменится и за пределами метода. ‘aString = amp;theString’ приведет к тому, что любая строка, которую вы передали в метод, будет указывать на строку даже после выхода из метода.

4. Хорошо, просто чтобы быть уверенным, как бы вы изменили приведенный выше код? (Учтите, что мне нужны некоторые изменения до и после вызова метода суперкласса

5. Трудно сказать, если я не знаю, чего вы пытаетесь достичь с помощью переопределенного метода.

Ответ №2:

Обратите внимание, что это совершенно неверно:

  - (void)exportXMLToString:(NSMutableString **)aString
  

Никогда не бывает причины иметь метод, который возвращает void и принимает ** аргумент. Вместо этого он должен просто возвращать значение напрямую.

Передача по ссылке используется в Objective-C очень редко, обычно только для NSError** параметров, хотя есть несколько других.