当我将对象分配给实例变量时,我有某种保留问题。我的理解是,所有的局部实例变量都是strong
,所以只要对象被实例变量引用,单独的赋值就足以确保对象不会被销毁,但事实并非如此。
在下面的代码中,我将实例MKRoute
变量myRoute
分配给来自计算方向调用的路由。此时myRoute
存在并有效,具有台阶和折线等特征。但后来在我的代码中,我试图访问myRoute
,我得到一个坏访问。
它似乎仍然有一个内存指针值,但对象的其余部分至少在调试器中消失了。没有折线或步骤等,或者至少不是它应该是什么。在我的代码中没有其他赋值或修改或myRoute
。我需要做些什么来确保这个对象不会被破坏?
@implementation SomeClass
MKRoute *myRoute = nil;
.
.
.
-(void) showRoute:(MKMapItem *)origin destination:(MKMapItem*)destination
{
MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
request.source = origin;
request.destination = destination;
request.requestsAlternateRoutes = NO;
MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
if (error) {
NSLog(@"ERROR %@",error);
// Handle Error
} else {
[self drawRoute:response];
}
}];
}
-(void)drawRoute:(MKDirectionsResponse *)response
{
for (MKRoute *route in response.routes)
{
myRoute = route; // set the global route
[mapView addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
}
}
.
.
.
@end
我很高兴地承认它是一个全局变量,而不是一个实例变量,但我仍然不明白为什么它失去了它的保留,如果我在变量声明中尝试STATIC或__strong,它仍然在drawwrite中分配,然后消失。
全局变量不是一种典型的或推荐的存储变量的方式,并且您没有提供关于访问该变量的代码以及当您崩溃时获得的堆栈(这对于准确诊断至关重要)的任何信息。
也就是说,您的问题可能是在一个队列上修改这个变量,而在另一个队列上访问它。calculateDirectionsWithCompletionHandler:
在主线程上执行它的完成处理程序。从其他线程访问它时是否发生崩溃?更新指针值不保证是原子的,如果您同时读取和更新,则有可能接收到一个垃圾指针。