1

Я делаю это в моем главном Тема:Objective-C: Распределение в одном потоке и выпустить в другой

CCAnimation *anim; //class variable 

[NSThread detachNewThreadSelector:@selector(loadAimation) toTarget:self withObject:nil]; 

В loadAimation:

-(void) loadAnimation { 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 
     anim = [[CCAnimaton alloc] init]; 
     [autoreleasepool drain]; 
} 

И в основном потоке я выпускаю его:

 [anim release]; 

Теперь я хочу спросить, хорошо ли это относится к управлению памятью.

+0

Действительно ли 'loadAimation' должен быть' loadAnimation'? Почему 'anim' является переменной класса, а не свойством? Каков код вокруг выпуска? Существует не достаточно тихая информация, чтобы определить, хорошо ли сбалансировано создание и разрушение объекта. – outis

+0

да, вы правы. Я предполагаю, что проблема действительно в том, что происходит вокруг выпуска (я просто хотел спросить, хорошо ли это делать). На самом деле это связано с cocos2d перед выпуском. Я делаю CCAction, и у меня есть CCSprite * sp, я просто делаю [sp runAction: anim]; пока анимация работает, я выпускаю ее, но ничего не происходит с анимацией визуально, но правильно? – Asymptote

+0

Это зависит от того, как все реализовано. Любой объект, который будет владеть, сохранит анимацию. Если объект не получает права собственности, он не сохранит анимацию. Проверьте документы cocos2d для правил собственности. Тем не менее, вы все равно можете столкнуться с [условием гонки] (http://en.wikipedia.org/wiki/Race_condition), который вызывает проблемы с управлением памятью (например, анимация выпущена в одном потоке, прежде чем объект-владелец сможет ее сохранить в другой поток). – outis

ответ

0

Это должно быть нормально, конечно, если вы защищаете доступ к переменной указателя.

1

В одном потоке можно выделить объект и освободить его в другом. Однако, в зависимости от того, как вы подходите к нему, ваш код может сделать это неправильно.

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

static CCAnimation *anim=nil; 

+(CCAnimation*)anim { 
    @synchronized(self) { 
     return [[anim retain] autorelease]; 
    } 
} 
+(void)setAnim:(CCAnimation*)animation { 
    @synchronized(self) { 
     if (anim != animation) { 
      [anim release]; 
      anim = [animation retain]; 
     } 
    } 
} 
-(void)loadAnimation { 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 
    [[self class] setAnim:[[[CCAnimaton alloc] init] autorelease]]; 
    [autoreleasepool drain]; 
} 
+0

Не выполняйте '@synchronize (self)' для реализации стандартного setter/getter. Используйте @property() и @synthesize. Результат будет быстрее и гарантированно правильно (не то, что приведенное выше неверно, но ... зачем писать код, который компилятор может написать для вас?). – bbum

+0

@bbum: потому что это не ваши стандартные аксессоры, а 'anim' не является свойством (экземпляром). Обратите внимание на '+' перед методами. 'anim' - это свойство класса, которое компилятор Apple не будет генерировать для вас (хотя он, похоже, поддерживает точечный синтаксис для них). «@ Synchronize» в getter и setter совершенно необходимы при работе с многопоточным. – outis

+0

Derp. Да, извините. Пропустил '+'. Обратите внимание, что ваш метод возврата неверен; если вы хотите, чтобы он был правильно атомарным, он должен «возвращать [[anim сохранить] autorelease];' чтобы гарантировать, что продолжительность жизни «anim» в локальном потоке соответствует правильной семантике (которая, по сути, @synthesize будет делать w/стандартные аксессоры в случае экземпляра). – bbum

 Смежные вопросы

  • Нет связанных вопросов^_^