2013-01-14 1 views
0

내가 만든 PhotoView 객체에 포함 된 사진의 이름을 (nslog) 인쇄하려고합니다. 나는 2 개의 viewcontrollers 클래스와 PhotoView 클래스를 만들어 UIButton 클래스를 확장하여 이전의 viewcontrollers 중 하나에서 그리드를 채 웁니다. PhotoView.h에서 viewcontroller에 문자열 값을 전달하고 있지만 EXC_BAD_ACCESS를 얻는 중

는 내가 같은 파일에 태그 photoName의 값을 인쇄 한 후
self.tag = [[data objectForKey:@"PhotoID"] intValue]; 
    self.photoName = [data objectForKey:@"PhotoName"]; 

이 PhotoView.m에

@interface PhotoView : UIButton 
@property (assign, nonatomic) NSString *photoName; 
... 

이 모든 것이 좋아 보인다. 내가, 내가 얻을에서 PhotoView을 클릭 한 후에서 PhotoView에

-(void)didSelectPhoto:(PhotoView*)sender 
{ 
    NSLog(@"%@", [NSString stringWithFormat:@"%@", sender.photoName]); 
} 

을 클릭 한 후 다른 클래스에서 photoName의 값을 인쇄 할 EXC_BAD_ACCESS 오류를하려고 할 때

문제는 시작합니다.

그러나, 나는

NSLog(@"%@",[NSNumber numberWithInt:sender.tag]]) 

을 할 경우이 오류가 발생하지 않습니다.

무엇이 잘못되었을 수 있습니까?

미리 감사드립니다.

답변

2

두 발언 :

  1. [NSString stringWithFormat:@"%@", sender.photoName] - 하십시오 안돼! 아니! 그렇게하지 마! 불필요하고 CPU 사이클을 낭비 할뿐만 아니라 가독성을 크게 떨어 뜨립니다.
:
NSLog(@"%@", sender.photoName); 
  1. 당신이 실제 오류가 이것이다 : 당신이 문자열이있는 경우, 당신은 단지 직접 문자열 객체를 사용, 이런 식으로 복제 할 필요가 없습니다
    @property (assign, nonatomic) NSString *photoName; 
    

    I. e. assign 속성이 있으므로 값이 유지되지 않습니다. 문자열 객체가 범위를 벗어나면 할당 해제됩니다 (weak이 아니기 때문에 자동으로 nil으로 설정되지는 않지만 유효하지 않은 포인터 인 가비지 값이 있으므로 충돌이 발생합니다). 당신은 ARC를 사용하지 않을 경우 대신

    @property (retain, nonatomic) NSString *photoName; 
    

    를 작성하고있는 경우

    @property (strong, nonatomic) NSString *photoName; 
    

    .

+0

"할당", a.k.a "약한"이라고 진술합니다. 실제로'약한'과'할당 된'은 중요한 차이가 있습니다. 그들은 동일하다는 것을 암시해서는 안됩니다. 또한 첫 번째 발언을 적절한 코드로 업데이트하는 것이 좋습니다. 그것이 틀렸고 왜 그런지 설명하는 것이 하나 있지만, 적절한 사용법을 보여주는 것이 더 도움이 될 것입니다. – rmaddy

+0

@rmaddy 공정한 의견, 조언 해 주셔서 감사합니다. 차이점을 찾아 냈습니다. 고정 코드. –

+0

제 문제에 대한 해결책을 주셔서 감사합니다. 나는 결코 이러한 속성에주의를 기울이지 않았고, 맹목적으로 자습서를 따랐다. 이제 속성이 가질 수있는 가능한 모든 속성에 대해 읽도록하겠습니다. 다시 한번 감사드립니다. – locorecto

관련 문제