私は 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 に表示できます