0

アプリケーションですべてのロジックを実行するためのプレゼンテーションモデルをインスタンス化するマップビューがあります。リストコンポーネントがあります。ユーザーは、地図上に表示したいデータをいくつか選択します。これはモデルに送信され、ビューで更新が呼び出されたら、NSObjectをマップビューに渡し、ビューでロジックを実行するためにこのデータをPMに渡します。

これがマップビューの私のコードです。最後の行は、物事がクラッシュする場所です "[pm showMKL:d];" 呼び出されます。この行をコメントアウトすると、物事はスムーズに進みます。

これはiOS6アプリであるため、ARCが使用されています。一部の検索ではメモリリークが示唆されましたが、プロファイラーを実行してもそれは示唆されなかったようです。また、プロファイリングをオンにしてアプリを実行すると、クラッシュを発生させることができませんでした。

#import "MapView.h"

@implementation MapView

-(id)initWithModel:(MainDM*)dm:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        _dm = dm;
        [_dm register:self];
        pm = [[MapPM alloc] initWithModel:_dm];

        CLLocationCoordinate2D coord = {.latitude =  32.61724, .longitude =  -106.74128};
        MKCoordinateSpan span = {.latitudeDelta =  1, .longitudeDelta =  1};
        MKCoordinateRegion region = {coord, span};

        [self setRegion:region];
    }
    return self;
}

-(void)update:(DataObject*)data
{
    if([[data getType] isEqualToString:@"CURRENT_KML_CHANGE"])
    {
        KmlVO *d = (KmlVO*)[data getData];
        [pm showMKL:d];
    }
}

@end

これがMapViewの.hです

#import <MapKit/MapKit.h>
#import "MainDM.h"
#import "BBView.h"
#import "MapPM.h"
@interface MapView : MKMapView <BBView>


@property(nonatomic,strong)MainDM *dm;
@property(nonatomic,strong)MapPM *pm;

-(void)update:(DataObject*)data;
-(id)initWithModel:(MainDM*)dm:(CGRect)frame;
@end

これがMapPMコードです。

#import "MapPM.h"
@implementation MapPM

-(id)initWithModel:(MainDM *)dm
{
    self = [super init];

    if(self)
    {
        _baseMaps = [[NSMutableArray alloc] init];
        _dm = dm;
    }
}
-(void)showMKL:(KmlVO*)vo
{

    if([_baseMaps containsObject:vo])
    {
        NSLog(@"not added");
    }
    else
    {
        NSLog(@"added kml");
        [_baseMaps addObject:vo];
    }
}
@end

これがPMの.hです

#import <Foundation/Foundation.h>
#import "MainDM.h"
#import "KmlVO.h"
@interface MapPM : NSObject

@property(nonatomic, retain)NSMutableArray * baseMaps;
@property(nonatomic, retain)MainDM *dm;
-(id)initWithModel:(MainDM *)dm;
-(void)showMKL:(KmlVO*)vo;

@end
4

1 に答える 1

1

結局、ヘッダーファイルを見る必要はありませんでした。

-(id)initWithModel:(MainDM *)dm
{
    self = [super init];

    if(self)
    {
        _baseMaps = [[NSMutableArray alloc] init];
        _dm = dm;
    }
}

あなたは自分自身を返していません、そしてそのように、あなたは未定義のオブジェクトに対してshowMKLを実行しています。警告を確認しましたか?

また、プロパティを使用しています(@interface内のインスタンス変数ではありません)。そのため、[pm showMKL:data]実際にはである必要があります[self.pm showMKL:data]

于 2013-02-19T16:37:00.923 に答える