6

я должен выполнить селектор по названию по классу (не экземпляр) и использовать ее возвращаемое значение:"performSelector может вызвать утечку" альтернативу, когда он протекает?

id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1]; 

Селектор создает новый экземпляр класса. Мне нужно использовать возвращаемый экземпляр. Очевидно, что я получаю обычный performSelector может вызвать утечку, потому что его селектор неизвестен предупреждение, поскольку этот проект скомпилирован с ARC.

Если я правильно (from the answers here и другие), в данном случае performSelector будет вызвать утечку (поправьте меня, если я ошибаюсь, то я мог бы просто отключить предупреждение и сделать с ней) понять. Селекторы реализованы следующим образом:

+ (id) objectWithFile:(NSString*)p1 
{ 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1]; 
} 

Каковы мои варианты, когда я должен использовать селектор из строки и селектор создает и возвращает новый экземпляр объекта?

Я считал NSInvocation, но его метод getReturnValue требует, чтобы я предоставил свой собственный выделенный буфер, в котором хранится возвращаемое значение. Я не уверен, что это даже работает с методами ARC и класса, или мне просто нужно, чтобы __bridge_transfer отбрасывал буфер возвращаемого значения malloc'ed до id, и это все, что ему нужно.

+0

Я еще не понимаю, почему у вас будет утечка в вашем случае. 'objectWithFile:' возвращает объект с автореализацией, потому что это не метод alloc/copy/new. –

+0

Я не уверен, что понимаю это правильно. Скажем, я возвращаю [Object new] вместо unarchived объекта, который тоже возвращает объект автообновления, но затем течет? Или произойдет ли утечка ** только **, если выполняемый селектор сам вызовет alloc, новый или скопированный? – LearnCocos2D

ответ

5

objectWithFile: не метод «Alloc, копирование, инициализация, mutableCopy, и новая семья» и поэтому «Unretained возвращаемых значений» метод в смысле "Clang/ARC documentation":

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

Так что независимо от того, что вы делаете внутри метода, вызывающему абоненту не нужно освобождать возвращаемый объект .

Поэтому я не думаю, что у вас есть утечка памяти в коде.

+0

Спасибо, это имеет смысл. Также подтверждает мое наблюдение, потому что возвращенные объекты освобождаются, если не удерживаются с сильным ref. – LearnCocos2D