2010-07-18 2 views
0

Всякий раз, когда мой метод устанавливает объект на onTouchEventReceiver, он теряется, когда другой метод вызывается другим потоком.Не удается установить объект в ObjC?

//In header 
id onTouchEventReceiver; 
SEL onTouchSelector; 

- (void) setOnTouchSelector:(SEL)sel withObject:(id)obj 
{ 
    NSLog(@"setting obj to %@",obj); 
    onTouchSelector = sel; 
    [self setOnTouchEventReceiver:obj]; 
    NSLog(@"====----- %@",onTouchEventReceiver); //That works 
} 

//Another thread calls this 
- (void) touchEventReceived 
{ 
    NSLog(@"firing a selector at %@ by %@",onTouchEventReceiver,self); 

    //Why on earth does that happen????? 

    if (onTouchEventReceiver != nil) //onTouchEventReceiver is (null) 
    { 
     [onTouchEventReceiver performSelector:onTouchSelector]; 
    } 
} 

Код производит следующее:

2010-07-18 23:40:54.776 app[737:903] setting obj to <appCtl: 0x10fa00> 
2010-07-18 23:40:54.787 app[737:903] ====----- <appCtl: 0x10fa00> 

... после того, как экран был растроган ...

Got touch event at coordinates 154 x 243 , mask : 2 
2010-07-18 23:41:39.342 app[737:3b03] AALayer hit test passed : <AALayer: 0x110af0> 
2010-07-18 23:41:39.348 app[737:3b03] firing a selector at (null) by <AALayer: 0x110af0> 

Почему это происходит? Код кажется правильным.

+1

не видят весь свой код, но вы уверены, что все это происходит в одном экземпляре? вы могли бы NSLog 'self', а также в setOnTouchSelector? – mvds

ответ

2

AALayer в вашем сообщении журнала заставляет меня думать, что это может быть подкласс CALayer. Если это так, то вы можете легко иметь два отдельных объекта. CALayer s дублируются для представления машинами рендеринга. Если это проблема, вам необходимо подклассифицировать -initWithLayer:, чтобы скопировать ваши дополнительные ivars соответствующим образом.

0

Я думаю, что я забыл @property. Вы можете:

1/Покажите мне код свойства

2/изменить эту строку: NSLog(@"====----- %@",onTouchEventReceiver); //That works в NSLog(@"====----- %@", [self getOnTouchEventReceiver]); // Это работает