Ios 对实例化的变量执行错误访问

Ios 对实例化的变量执行错误访问,ios,objective-c,Ios,Objective C,我在viewDidLoad中初始化变量userMarkerLayer。当我在该方法中使用它时,访问是可以的。但我设置了一个按钮,我想在按钮点击时访问它 @implementation MapViewController { NTVectorElementLayer *userMarkerLayer; } (void)viewDidLoad { [super viewDidLoad]; userMarkerLayer = [NTNeshanServices c

我在viewDidLoad中初始化变量userMarkerLayer。当我在该方法中使用它时,访问是可以的。但我设置了一个按钮,我想在按钮点击时访问它

 @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];