2010-12-29 8 views
1

나는 가능한 한 분명히하려고 노력할 것이다. 처음부터 시작하자. myLocation에서 거리가있는 장소의 목록이 포함 된 tableview가 포함 된 애플리케이션이 있습니다. 이제 매번 내가 지금은 distanceString 응용 프로그램 충돌을 사용하는 경우 지금 다음 코드아이폰 애플리케이션. 자기 키워드없이 충돌

- (void)locationUpdate:(CLLocation *)location { 
myLocation = location; 
for (Trek * trek in list) { 
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:[trek latitude_start]    longitude:[trek longitude_start]]; 
    double dis = [locationManager getDistance: loc]; 
    [trek setDistance:dis]; 
    [trek setDistanceUnit]; 
    [loc release]; 
} 

[self.tableView reloadData]; 
} 

이 코드 조각을 [trek setDistanceUnit]; 전화

-(void) setDistanceUnit { 

if (self.distance < 1000.0) 
    self.distanceString = [NSString stringWithFormat:@"%.0lf m", self.distance]; 
} 

을 실행 GPS 위치에서 업데이 트를 얻을. 이제는 뷰를 통해 셀을 그리는 데 필요한 액세스와 동시에 업데이트가 동시에 (병렬로) 실행될 수 있다는 점과 관련이 있다고 생각합니다. 누구든지 어떤 생각을 가지고 있습니까? 도움이된다면 더 많은 코드를 게시 할 수 있습니다.이 게시물을 너무 오래 게시하기에는 너무 많이 게시하고 싶지 않습니다.

나는 어디에서나 검색하려했지만 지금까지 아무 것도 찾을 수 없었습니다. 사전에

감사합니다, 움베르토

PS 이제 응용 프로그램이 작동하지만 난 무슨 일이 일어나고 있는지 이해하고 싶습니다.

+0

'self'는 키워드가 아니며 암시적인 변수입니다. 함수 등에서와 같이 메소드 구현 외부에서 변수 이름'self'를 사용할 수 있습니다. – dreamlax

답변

5

distanceString이 보유 속성 인 경우 self을 지정하지 않으면 할당자를 건너 뛰고 유지하지 않고 충돌을 설정합니다. 따라서 문자열이 autorelease 풀로 보내질 때 할당 해제되면 앱이 다운됩니다.

@synthesize을 사용하여 접근자를 합성하고 도트 표기법 (또는 setDistanceString:)을 사용하면 객체가 문자열을 유지하므로 객체가 릴리스 될 때까지 항상 포인터가 그 객체에 대한 포인터를 갖습니다.

+4

이것이 점 표기법을 싫어하는 이유 중 하나입니다. 도트 연산자와 대입 연산자 모두에 모호함이 추가됩니다. – dreamlax

+0

@dreamlax : 예, 설정시'self.propName ='대신'[self setPropName :'을 사용합니다. – BoltClock

+0

또는 시작과 끝에서 항상 인스턴스 변수의 이름을'_'로 지정하고,'@synthesize foo = foo_; '를 사용하십시오. – bbum

관련 문제