iOS и Objective-C: по-голямата част от процесорното време се изразходва в [NSObject release] и [NSObject retain], но методът на класа не извършва никакви операции с памет

Приложенията за обработка на изображения работят бързо на симулатора, но са наистина бавни на реално устройство (iPhone 4GS).

Когато стартирам приложението под „инструменти“, виждам следното дърво на повикванията:

въведете описание на изображението тук

Имайте предвид, че се съобщава, че извикванията в червения кръг отнемат почти цялото време на процесора на метода.

Въпросният метод е метод на клас (не метод на екземпляр), със следния код:

@implementation Line2F

+ (CGFloat)signTested:(Point2F *)tested p1:(Point2F *)p1 p2:(Point2F *)p2
{
    return [Line2F signTestedX:tested.x testedY:tested.y
                           p1x:p1.x p1y:p1.y
                           p2x:p2.x p2y:p2.y];
}

+ (CGFloat)signTestedX:(CGFloat)testedX testedY:(CGFloat)testedY
                   p1x:(CGFloat)p1x p1y:(CGFloat)p1y
                   p2x:(CGFloat)p2x p2y:(CGFloat)p2y
{
  return (testedX - p2x) * (p1y - p2y) - (p1x - p2x) * (testedY - p2y);  
}

@end

Може ли някой да обясни защо по-голямата част от процесорното време се изразходва за [NSObject release] и [NSObject retain]?


person Guy    schedule 18.03.2013    source източник


Отговори (2)


Ако не знае нищо по-добро, ARC ще запази всички аргументи на метод и ще ги освободи, когато методът излезе (вижте този имейл от пощенския списък на objc език).

Трябва да можете да избегнете това, като анотирате аргументите към +signTested:p1:p2: с __weak или __unsafe_unretained, според вашите нужди.

person Community    schedule 18.03.2013
comment
Проблемът не е в +signTestedX:testedY:p1x:p1y:p2x:p2y:, който приема аргументите CGFloat; както отбелязвате, плаващите не са обекти и семантиката там не би имала смисъл. Проблемът е в +signTested:p1:p2:, който извиква до +signTestedX:testedY:p1x:p1y:p2x:p2y: и приема Point2F аргумента, които (изглежда) са обекти, които могат да бъдат задържани/освободени. - person ; 18.03.2013
comment
предаването на директива __weak все още има известна ARC обработка, но е по-бързо. Единственият начин, който намерих за пълно премахване, е просто да предам CGFloat вместо обекти. - person Guy; 18.03.2013

Може да има много неща. Както казва FrozenDevil, може да е свързано с ARC, ако го използвате. Предполагам, че най-вероятно методът се нарича различно време в огромен цикъл. Опитайте се да подадете слаби референции, но разбира се трябва да сте сигурни, че те съществуват за целия процес. Бих се опитал също така да оптимизирам цикъла, вграждащ всеки цикъл в пул за автоматично освобождаване.

person Andrea    schedule 18.03.2013