0

私は NSMutableDictionary を持っています。これは、非同期で受け取るいくつかのカスタム NSObjects に追加します。新しいデータを受け取るたびに、辞書をクリアしてから新しいオブジェクトを追加します。次に、データを別のクラス「UIView」にプッシュして、コンテンツを辞書にレンダリングします。私が知る限り、アクセスしようとしているオブジェクトが解放されたことを意味する SIGABRT 例外が発生しています。私は同期ブロックを試し、変更可能なコピーを作成し、すべての値を取得しましたが、今は何も機能しません同期をどのように達成できるかという質問

ここにコード スニペットがあります。

@interface MyAltViewController : UIViewController
{
   __block NSMutableDictionary *currentDataList;
    TestUIVIEW *myUIVIEW
}
@implementation MyAltViewController

......
- (void)viewDidLoad
{
   currentDataList = [[NSMutableDictionary alloc] initWithCapacity:10];
   [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(processDataMessag:)
                                         name:view_Data object:nil];
}
.....
-(void)processDataMessag:(NSNotification *) notification
{
  [currentDataList removeAllObjects];
  NSArray tmpAr= (NSArray*) [notification object]
  dispatch_async(dbQueue, ^(void)
  {
     /// Loop through the array and process the data then add to NSDictionary 

     [self pushtoMUViewLayer:currentDataList];
  });

}
.........
 -(void)pushtoMUViewLayer:(NSMutableDictionary *)ina
 {
     /// Even here if i try to access and object within 
     /// currentDataList and just a specific NSString i get the SIGABRT
    [myUIVIEW updateWithData:ina];
 }
 //////////////////////////////////////////////////
 @interface TestUIVIEW : UIView
 {
    NSMutableDictionary *mdata;
    UIImage *outputImage ;

 }
 @property (assign) NSMutableDictionary *mapdata;
 @property (retain) UIImage *outputImage ;

  @implementation TestUIVIEW
    .......
  -(void)updateWithData:(NSMutableDictionary *)data
  {
     mdata = [data retain]; // ??? not  sure how to set it correctly
      dispatch_async(dispatch_get_main_queue(), ^(void)
      { 
        [self CreateImage];
        [self setNeedsDisplay];
      });
  }
  -(void) CreateImage
  {
    NSString *key;
    for(key  in mapdata)
    {
        DataMessage *tmpData= (DataMessage*)[mapdata objectForKey:key];
        NSString *aID = [ tmpData alt] ;
        double aLat   = [ tmpData lat]  ;
        double aLong  = [ tmpData lon] ;
       /*
          Drawing code  I can Get aLat & A Long
          but it fails with SiABRT when trying to render 
          aID
       /*
    }
  }

  - (void)drawRect:(CGRect)rect
  {
    // Drawing code

   CGPoint imagePoint = CGPointMake(0, 0);

   [outputImage drawAtPoint:imagePoint];

}

/// その同期が機能しなかった場合。NSNotification を使用して currentDataList // を currentDataList に表示できます

4

1 に答える 1

0

NSDictionary にアクセスするすべての場所に @synchronized ブロックを追加すると、問題が解決しました。ご意見をお寄せいただきありがとうございます

于 2013-01-28T19:45:14.153 に答える