Подтвердить что ты не робот

IOS: Как удалить объект из памяти с включенным ARC?

Я разрабатываю приложение iOS с IOS 5 SDK, включен автоматический подсчет ссылок. Но у меня есть определенный объект, который создается большими числами и должен быть выпущен через секунду, потому что в противном случае устройство станет очень медленным. Похоже, что они не выпущены, так как устройство работает очень медленно. Есть ли способ вручную освободить объект, когда включена функция ARC?

EDIT: Мой код, это называется 200 раз в секунду, чтобы генерировать блестки. Они исчезают через 0,8 секунды, поэтому после этого они бесполезны.

    int xanimationdiff = arc4random() % 30;
    int yanimationdiff = arc4random() % 30;
    if (arc4random()%2 == 0) {
        xanimationdiff = xanimationdiff * -1;
    }
    if (arc4random()%2 == 0) {
        yanimationdiff = yanimationdiff * -1;
    }

    Sparkle *newSparkle = [[Sparkle alloc] initWithFrame:CGRectMake(20 + arc4random() % 280, 20, 10, 10)];
    //[newSparkle setTransform:CGAffineTransformMakeRotation(arc4random() * (M_PI * 360 / 180))]; //Rotatie instellen (was niet mooi, net sneeuw)
    [self.view addSubview:newSparkle];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.8];
    [newSparkle setFrame:CGRectMake(newSparkle.frame.origin.x - xanimationdiff, newSparkle.frame.origin.y - yanimationdiff, newSparkle.frame.size.width, newSparkle.frame.size.height)];
    newSparkle.alpha = 0;
    [UIView commitAnimations];

Код объекта искры:

#import "Sparkle.h"

@implementation Sparkle

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"sparkle.png"]]];
    }
    return self;
}

@end
4b9b3361

Ответ 1

Object* myObject = [[Object alloc] init];     
myObject = nil; // poof...

EDIT: вы не можете напрямую контролировать, когда объект выпущен, но вы можете косвенно вызвать его. Как? Помните, что ARC делает ТОЧНО. В отличие от соглашения о кодировании человека, ARC анализирует ваш код и вставляет операторы релиза AS SOON AS OBJECTS CAN. Это освобождает память для новых распределений сразу, что является удивительным/необходимым.  Смысл, установка объекта на нуль или просто разрешение переменной выйти из области видимости... что-то, что ПРИЧИНА A 0 RETAIN COUNT заставляет ARC размещать там свои релизы.  Это должно... потому что это утечка в противном случае.

Ответ 2

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

Ответ 3

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

Ответ 4

С ARC вы не можете вызывать dealloc, release или retain, хотя вы все равно можете сохранить и освободить объекты CoreFoundation (NB: вы можете реализовать методы dealloc для своих собственных подклассов, но вы можете "t вызов super dealloc). Таким образом, простой ответ" нет", вы, к сожалению, не можете вручную освободить объект при использовании ARC.

Я бы дважды проверял, что вы уверены, что они не выпущены, потому что теоретически, если вы больше не ссылаетесь на объект, он должен быть выпущен. Что вы будете делать с этими объектами после их создания? Вы просто создаете их, а затем немедленно уничтожаете их?

Возможно, вы могли бы опубликовать код, который используете/объявления свойств, - это те объекты weak или strong, на которые ссылаются?