Ios 对实例化的变量执行错误访问
我在viewDidLoad中初始化变量userMarkerLayer。当我在该方法中使用它时,访问是可以的。但我设置了一个按钮,我想在按钮点击时访问它Ios 对实例化的变量执行错误访问,ios,objective-c,Ios,Objective C,我在viewDidLoad中初始化变量userMarkerLayer。当我在该方法中使用它时,访问是可以的。但我设置了一个按钮,我想在按钮点击时访问它 @implementation MapViewController { NTVectorElementLayer *userMarkerLayer; } (void)viewDidLoad { [super viewDidLoad]; userMarkerLayer = [NTNeshanServices c
@implementation MapViewController
{
NTVectorElementLayer *userMarkerLayer;
}
(void)viewDidLoad {
[super viewDidLoad];
userMarkerLayer = [NTNeshanServices createVectorElementLayer];
[userMarkerLayer addMarker: marker]; // This is ok
}
-(IBAction)showList:(id)sender {
[userMarkerLayer addMarker: marker];
// error:
// Thread 1: EXC_BAD_ACCESS (code=1, address=0x150543c30)
}
cannot access the userMarkerLayer!
启用ARC时,此问题不会发生。但我必须设置它的编号。因为您使用的是MRC ARC disabled,请阅读 在代码中,有一个ivar实例变量
@implementation MapViewController {
NTVectorElementLayer *userMarkerLayer;
}
。。。你正在给它分配一个对象
userMarkerLayer = [NTNeshanServices createVectorElementLayer];
。。。但这里的问题是,您不拥有这个对象,CreateVectoreElementLayer方法名称中没有alloc、new、copy或mutableCopy
这意味着您正在存储对该对象的引用,但该对象可以随时消失。您必须使用retain获得此对象的所有权
要解决此问题,请获取所有权
userMarkerLayer = [[NTNeshanServices createVectorElementLayer] retain];
。。。并添加dealloc方法
- (void)dealloc {
[userMarkerLayer release];
[super dealloc];
}
或者将其声明为具有retain
。。。并使用self.userMarkerLayer而不仅仅是userMarkerLayer
请阅读如何提供。这还不够。它没有显示userMarkerLayer是如何存储的,什么是标记,它是如何创建的,在视图控制器的生命周期中您对它们做了什么。。。创建MRE并更新您的问题。@zrzka谢谢。我更新了问题。标记并不重要,因为访问错误是针对userMarkerLayer的。是否应该将userMarkerLayer替换为self.userMarkerLayer?您正在viewDidLoad中设置一个局部变量,该变量在方法完成后立即超出范围。@skaak nope,userMarkerLayer是ivar,您可以这样使用。这不是一个局部变量。顺便说一句,默认情况下它是强的。@FattanehTalebi很抱歉,但这仍然是不够的信息。stacktrace看起来怎么样?什么是马克笔?它是如何储存的?它不是MRE,甚至不可编译-在void之前。。。我的意思是,根据你提供的信息,这是一个猜测游戏。FWIW我建议最后一种方法,你使用属性和自我
@interface MapViewController ()
@property (nonatomic, retain) NTVectorElementLayer *userMarkerLayer;
@end
self.userMarkerLayer = [NTNeshanServices createVectorElementLayer];