मैं 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 को सक्षम करता हूं, तो यह समस्या नहीं होती है। लेकिन मुझे इसे नंबर सेट करना होगा।

0
Fattaneh Talebi 15 जून 2020, 11:39

1 उत्तर

सबसे बढ़िया उत्तर

चूंकि आप एमआरसी (एआरसी अक्षम) का उपयोग कर रहे हैं, कृपया स्मृति प्रबंधन नीति

आपके कोड में, आपके पास एक ivar (उदाहरण चर) है ...

@implementation MapViewController {
    NTVectorElementLayer *userMarkerLayer;
}

... और आप इसे एक ऑब्जेक्ट असाइन कर रहे हैं ...

userMarkerLayer = [NTNeshanServices createVectorElementLayer];

... लेकिन यहां समस्या यह है कि आप इस वस्तु के स्वामी नहीं हैं (alloc, new, copy या mutableCopy createVectorElementLayer विधि नाम में) .

इसका मतलब है कि आप इस ऑब्जेक्ट का संदर्भ संग्रहीत कर रहे हैं, लेकिन यह ऑब्जेक्ट कभी भी दूर जा सकता है। इस वस्तु का स्वामित्व लेने के लिए आपको retain का उपयोग करना होगा।

इसे ठीक करने के लिए, एक स्वामित्व लें ...

userMarkerLayer = [[NTNeshanServices createVectorElementLayer] retain];

... और dealloc विधि जोड़ें ...

- (void)dealloc {
    [userMarkerLayer release];
    [super dealloc];
}

या इसे retain के साथ एक संपत्ति के रूप में घोषित करें ...

@interface MapViewController ()

@property (nonatomic, retain) NTVectorElementLayer *userMarkerLayer;

@end

... और केवल userMarkerLayer के बजाय self.userMarkerLayer का उपयोग करें ...

self.userMarkerLayer = [NTNeshanServices createVectorElementLayer];
1
zrzka 15 जून 2020, 11:26