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

相關問題