使用扩展CLPlacemark的自定义类填充NSMutableArray后出现错误访问

时间:2013-11-25 22:09:58

标签: ios objective-c nsmutablearray exc-bad-access

我有一个PlaceAnnotation类,我填入NSMutableArray。在viewDidLoad中,我发起了ihatethis

_ihatethis = [[NSMutableArray alloc]init];

我使用MKLocalSearchCompletionHandler进行搜索。并处理这样的m​​apitems:

for (MKMapItem *mapItem in [response mapItems]){

     PlaceAnnotation *place = [[PlaceAnnotation alloc] init];
     [place assignTitle:[[mapItem placemark] name];

     [_ihatethis addObject:place];
}

[_ihatethis removeObjectAtIndex:2]; /*BAD ACCESS HERE*/
[_tableView reloadData];

这是我的PlaceAnnotation.h文件

@interface PlaceAnnotation : CLPlacemark <MKAnnotation>

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly, copy) NSString *title;
@property (nonatomic) NSDictionary* dict;
//@property (nonatomic) NSURL *url;
@property (nonatomic) NSString *phoneNum;
@property (readonly) BOOL selected;

-(void)assignTitle:(NSString *)newTitle;
-(void)assignSelected:(BOOL) boolVal;

这是我的PlaceAnnotation.m文件

#import "PlaceAnnotation.h"

@interface PlaceAnnotation ()

@property (readwrite) NSString *title;
@property (readwrite) BOOL selected;

@end

@implementation PlaceAnnotation

-(void) assignTitle:(NSString *)newTitle {
    if ( ![newTitle isEqualToString:[self title]]){
        self.title = newTitle;
    }
}

-(void) assignSelected:(BOOL)boolVal{
    self.selected = boolVal;
}

@end


@end

这是我的第一篇文章,我已经阅读了大量回答exc_bad_access问题的答案,我无法弄清楚这一点。所以我认为不知何故,地方注释被遗忘和释放。所以,当我去删除后,它就消失了。我真的很困惑和生气。

3 个答案:

答案 0 :(得分:1)

如果崩溃真的在这一行[_ihatethis removeObjectAtIndex:2];并且它是EXC_BAD_ACCESS那么有两种可能性:

  1. _ihatethis指向一个损坏的数组(如果循环通过,则不太可能)。
  2. 数组中的对象已被过度释放或已在其dealloc方法中破坏了内存管理。

答案 1 :(得分:0)

可能是您尝试删除索引大于数组计数的项目。尝试在[_ihatethis removeObjectAtIndex:2];之前输出计数,如下所示:

`
NSLog(@"count: %d", [_ihatethis count]);
[_ihatethis removeObjectAtIndex:2]; /*BAD ACCESS HERE*/
`

如果计数小于3,那么您正在尝试删除数组边界外的索引处的对象。

答案 2 :(得分:0)

我改变了这个

@interface PlaceAnnotation : CLPlacemark <MKAnnotation>

到这个

@interface PlaceAnnotation : NSObject <MKAnnotation>

所以我猜问题就在于CLPlacemark的dealloc。感谢