我正在为unity3D创建一个iOS插件。下面是代码。使用EXC_BAD_EXCESS调用[regionMonitor startMonitor]函数时,怎么会轰炸呢?根据互联网帖子,它似乎是一个内存管理错误。任何人都可以看到这里的问题。感谢。
“RegionMonitoringPlugin.h”
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface RegionMonitoringPlugin : NSObject <CLLocationManagerDelegate>
{
CLLocationManager *locationManager;
}
-(void)leavingHomeNotify;
-(void)startMonitor:(float)latitude longitude:(float)longitude radius:(float)raduis;
@end
“RegionMonitoringPlugin.mm”
#import "RegionMonitoringPlugin.h"
@implementation RegionMonitoringPlugin
- (id) init
{
if (self = [super init])
{
locationManager = [[[CLLocationManager alloc] init] autorelease];
locationManager.delegate = self;
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
}
return self;
}
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
[self leavingHomeNotify];
}
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
[self leavingHomeNotify];
}
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)regionwithError:(NSError *)error
{
NSLog(@"Location error %@, %@", error, @"Fill in the reason here");
}
-(void)leavingHomeNotify
{
UILocalNotification *note = [[UILocalNotification alloc] init];
note.alertBody= @"Region Left";
[[UIApplication sharedApplication] presentLocalNotificationNow:note];
[note release];
}
-(void)startMonitor:(float)latitude longitude:(float)longitude radius:(float)radius
{
CLLocationCoordinate2D home;
home.latitude = latitude;
home.longitude = longitude;
CLRegion* region = [[CLRegion alloc] initCircularRegionWithCenter:home radius:radius identifier:@"home"];
[locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyBest];
[region release];
}
@end
extern "C" {
static RegionMonitoringPlugin *regionMonitor;
// Unity callable function to start region monitoring
BOOL _startRegionMonitoring(float m_latitude,float m_longitude, float m_radius)
{
if (![CLLocationManager regionMonitoringAvailable] || ![CLLocationManager regionMonitoringEnabled] )
return NO;
if (regionMonitor == nil){
regionMonitor = [[[RegionMonitoringPlugin alloc]init ] autorelease];
}
[regionMonitor startMonitor:m_latitude longitude:m_longitude radius:m_radius];
return YES;
}
}
答案 0 :(得分:1)
如果我看到的正确,您不应该autorelease
locationManager
,也不应该regionMonitor
。
在dealloc
release
处添加locationManager
方法。停止位置监控后,应释放regionMonitor
。