0

当我将对象分配给实例变量时,存在某种保留问题。我的理解是所有的本地实例变量都是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 

我很高兴地承认它是一个全局变量VS实例变量,但我还是不明白为什么它失去了保留,如果我尝试静态或__strong上它仍然缠在赋值的变量声明拖曳路线,后来走了。

+1

仅供参考 - 如果myRoute被声明在不中途的地方,那么'myRoute'不是一个实例变量。 – rmaddy

+1

您的编辑确认'myRoute'不是伊娃。这是一个文件全局变量。 – rmaddy

回答

0

全局变量不是一种典型的或推荐的方法来存储变量,并且您没有提供任何有关此变量和您在崩溃时获得的堆栈的代码的信息(这对准确诊断至关重要)。

也就是说,你的问题很可能是你在一个队列上修改这个变量,而在另一个队列上访问它。 calculateDirectionsWithCompletionHandler:在主线程上执行其完成处理程序。从其他线程访问它时是否发生崩溃?更新指针值不被认为是原子性的,如果您正在读取和更新,则可能会收到垃圾指针。

+0

我试图访问它 - (void)encodeRestorableStateWithCoder:(NSCoder *)编码器只是在任何尝试访问它时抛出一个错误的访问。 – user282172

+0

这没有多大帮助。 'MKDirectionsResponse'不符合'NSCoding',所以你怎么存储它?该方法用于存储特定对象,而不是全局状态(全局状态通过 'application:willEncodeRestorableStateWithCoder:'存储)。你在那个时候有什么线索?崩溃线程的堆栈转储对于理解问题以及打印到控制台的任何错误至关重要。它通常会告诉你出了什么问题。不要猜测。 –

+0

正在进行自定义ecoding工作,但这不是这个问题,因为它甚至没有得到那么多。任何尝试访问myRoute只是抛出一个糟糕的访问...没有给出堆栈跟踪.. 整个方法只不过是NSLog(@“route name%@”,myRoute.name);它只是在调试时在变量本身抛出一个坏的ACCESS,它不会显示任何只有myRoute是NSObject的元素。它确实有一个指针值,但在该位置似乎没有任何相关性/正确性,就像指出的元素被释放一样。线程是线程1。 – user282172

相关问题