문제

이 질문은 기반이 될 수 있지만 여기에 제가있는 문제가 있습니다.

나는 iPhone SDK에서 예제를 실행하려고 노력하고 있으며 액세스 위반에 실행됩니다. 나는 의심 스럽다고 생각하는 행동을 추적했다.

수업의 모습은 다음과 같습니다.

@interface TableViewCell : UITableViewCell {

@private    
    UILabel *_earthquakeLocationLabel;
    UILabel *_earthquakeDateLabel;
    UILabel *_earthquakeMagnitudeLabel;
    UIImageView *_magnitudeImageView;
}

중단 점을 설정할 때

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

디버거에서 "self"를 살펴보면 _earthquakedatelabel이 "0x12", _earthquakemagnitudelabel이고 다른 두 개는 0임을 보여줍니다. 0이 아닌 것 중 하나에 할당하려고하면 액세스 위반을받습니다.

나는 무슨 일이 일어나고 있는지 추측하고있다. 이것들은 그들에게 가짜 값이 있고, 내가 그들에게 할당하려고 할 때, 그것은 가짜 가치에 대한 참조를 줄이고 날려 버린다는 것이다. 그러나 내가 말했듯이, 나는 객관적인 C를 처음 접했기 때문에 기지에서 벗어날 수 있습니다.

제 질문은, 내가해야 할 이러한 가치를 초기화하는 데 특별한 점이 있습니까? 아니면 가짜 값이있을 때 값에 할당하는 방법이 있습니까?


몇 가지 추가 정보 :

따라서 nil을 _earthquakedatelabel 및 _earthquakemagnitudelabel에 초기화하여 할당하면 문제가 해결됩니다. 그러나 나는 왜 그 필드에서 값으로 객체가 생성되는지 이해하지 못한다. 나는 그들이 nil이 될 것으로 기대합니다. 객체는 힙에 생성되고 있습니다.

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

올바른 솔루션이 없습니다

다른 팁

그것은처럼 들린다 self 포인터는 가짜입니다. 0x12 및 0x1000 값은 정수 상수입니다. 그들은 확실히 유효한 메모리 주소에 대한 포인터가 아닙니다. 당신이 그 가치를보고 있다는 사실은 무언가 잘못되었음을 나타내고 어떤 식 으로든 그것들을 조작하려고 시도하면 (읽기 또는 쓰기) 악성이 발생합니다. 이 경우 메모리 주소 0x12 및 0x1000에 쓰러지려고하기 때문에 액세스 위반이 발생합니다.

어떻게 만들고 있습니까? TableViewCell 사물? 당신은하고 있습니까? TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? 그것이 올바른 방법입니다.

이제 나는 내 심령 디버거를 불러 일으킬 것입니다 : 나의 추측 당신이 당신을 선언하는 것을 잊고 있다는 것입니다 TableViewCell 포인터가있는 객체, 즉 당신은 그것을 TableViewCell myCell 대신에 TableViewCell *myCell (별표의 존재에 주목하십시오). 이렇게하면 힙 대신 스택에 객체가 생성되며 결과적으로 0 대신 데이터 구성원에 쓰레기가 생깁니다. Objective-C 객체는 올바르게 할당되면 모든 데이터 구성원이 0으로 초기화됩니다 (또는 NULL, nil 또는 false, 데이터 유형에 따라) 성공적인 호출 후 alloc.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top