0

私のメソッドがオブジェクトをonTouchEventReceiverに設定するときはいつでも、別のメソッドが別のスレッドによって呼び出されると、そのオブジェクトは失われます。

//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>

なぜそれが起こるのですか?コードは正しいようです。

4

2 に答える 2

2

ログメッセージにあるのAALayerは、のサブクラスである可能性があると私に思わせますCALayer。この場合、2つの別々のオブジェクトを簡単に作成できます。CALayer■レンダリング機構によるプレゼンテーションのために複製されます。これが問題である場合は、-initWithLayer:余分なivarを適切にコピーするためにサブクラス化する必要があります。

于 2010-07-19T01:10:19.913 に答える
0

@propertyを忘れたと思います。あなたはできる :

1/プロパティコードを表示

2 /この行を: NSLog(@"====----- %@",onTouchEventReceiver); //That worksに 変更しますNSLog(@"====----- %@", [self getOnTouchEventReceiver]);//それは機能します

于 2010-07-19T01:20:51.497 に答える