Управление памятью в Objective-C, свойство возвращает объект objc-c с числом сохранений 1, UIGraphicsBeginImageContextWithOptions

#objective-c #ios #cocoa-touch #memory-management

#objective-c #iOS #cocoa-touch #управление памятью

Вопрос:

Я запустил анализатор, и я не уверен, как работает пара функций управления памятью. У меня есть свойство (у него нет пользовательских установщиков или получателей):

 @property (nonatomic, retain) NSMutableArray *myArray;
 

Затем я попытаюсь использовать его позже:

 if ([[MyClass sharedDelegate].myArray containsObject:"test"])
 

В нем говорится: «свойство возвращает объект Objective-C с числом сохранений 1»

Где sharedDelegate определяется как:

  (MyApp*)sharedDelegate
{
    return (MyApp*)[[UIApplication sharedApplication] delegate];
}
 

Я не понимаю этого, так как я не вижу, где находится сохранение? Я думал, что при использовании свойства таким образом используется метод getter, который просто возвращает значение myArray . Итак, где утечка памяти?

Затем он указывает на

 UIGraphicsBeginImagecontextWithOptions(container.bounds.size, YES, 1.0);
 

Утечка объекта: выделенный объект не упоминается позже в этом пути выполнения и имеет количество сохранений 1

Я также не понимаю этого или как это связано с первой утечкой памяти. Они кажутся не связанными.

Ответ №1:

Что такое средство получения для myArray? @synthesize или пользовательский?

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

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

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

1. Я добавил метод sharedDelegate, чтобы помочь сузить проблему, поскольку я все еще не вижу ошибки. Спасибо.

Ответ №2:

Вы отметили свойство для возврата сохраненной ссылки.

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

1. сохранить означает сохранить при наборе, а не сохранить при получении.