当我将对象分配给实例变量时,我遇到了某种保留问题。我的理解是所有本地实例变量都是strong
所以仅仅赋值就足以确保只要实例变量引用了对象就不会被销毁,但事实并非如此。 / p>
在下面的代码中,我将实例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
我很高兴承认它是一个全局变量vs一个实例变量,但我仍然不明白为什么它会失去保留,如果我在变量声明上尝试STATIC或__strong它仍然会在drawroute中分配然后过去了。
答案 0 :(得分:0)
Globals不是典型或推荐的存储变量的方法,并且您没有提供有关访问此变量的代码以及崩溃时获得的堆栈的任何信息(这些是准确诊断至关重要。)
也就是说,您的问题可能是您在一个队列上修改此变量而在另一个队列上访问它。 calculateDirectionsWithCompletionHandler:
在主线程上执行其完成处理程序。从其他线程访问它时是否发生了崩溃?更新指针值不承诺是原子的,如果您同时读取和更新,则可能会收到垃圾指针。