2011-08-07 5 views
0

내가 몇 시간 후에 앱이 다운되는 이유를 알 수 없습니다.할당 및 해제 문제

포션 T는 비 원자력, 유지, 읽기 전용입니다.

-(void)First:(NSString*)Potions { 

    potionsT = [[NSString alloc] initWithString:Potions]; 
} 

-(void)After:(NSString*)Potions { 
    [potionsT release]; 
    potionsT = [[NSString alloc] initWithString:Potions]; 

처음 보는 사람이 처음입니다. 그 후 나는 몇 시간 후에 전화를합니다. ECX_BAD_ACCESS와 함께 .. 나는 그 모든 기억 관리 일로 꽤 멍청하다. 나는 그것을 안다. 고마워!

답변

3

보유 속성의 포인트는 설정시 보유 및 해제를 처리하는 것입니다.

- (void)first:(NSString*)potions 
{ 
    self.potionsT = potions; // will automatically release old value and retain new 
} 

- (void)after:(NSString*)potions 
{ 
    self.potionsT = potions; // same as above 
} 

또한 내가 after:After: 당신의 Potions, potions-First:first:로 변경하는 방법과주의. Objective-C 명명 규칙은 변수와 메소드를 소문자로 시작하고 클래스 이름을 자본으로 시작하는 것입니다.

+0

안녕하세요, 그래도 해봤지만 여전히 충돌합니다 .. – Eli

+0

디버거가 말하는 것 또는 더 많은 코드와 같은 좀 더 자세한 내용이 좋을 것입니다 ... –

2

@synthesize 해당 속성은 @implementation 클래스에 있습니까? 그렇다면, 당신은 사용해야합니다

self.potionsT = Potions; 

당신이 당신이 바르가 아닌 속성에 액세스하는

potionsT = ... 

를 사용하는 경우. 속성에 액세스하여 메모리 관리를 수행하게하려면 인스턴스 참조 앞에 인스턴스를 추가해야하며 이는 또한 자체가 될 수 있습니다.

속성을 사용하는 경우 속성이 이미 사용자를 대신하기 때문에 potionsT를 수동으로 릴리스해서는 안됩니다.

당신이 속성으로 potionsT을 설정 한 경우
+0

안녕하세요, 그래도 해봤지만 여전히 충돌합니다. – Eli

+0

코드가 충돌하는 데는 여러 가지 이유가있을 수 있습니다. 왜 코드가 "고장"(왜, 어떻게?)하는지 더 많은 코드를 확인해야합니다. 디버거를 사용하여 일어나는 곳을 찾으십시오. –

2

, 당신이 그런 식으로 접근해야한다 : 두 경우 모두

-(void)first:(NSString*)potions { 
    self.potionsT = potions; 
} 

-(void)after:(NSString*)potions { 
    self.potionsT = potions; 
} 

을, 나는 (그 무엇 self.potionsT 의미의) potionsT에 대한 접근을 사용하도록 코드를 변경 . 나는 또한 새로운 문자열을 만드는 것이 아니라, 제공된 문자열을 유지하는 것이다. NSStrings는 불변이므로, 결과는 같습니다. 그래도 최상의 결과를 얻으려면 potionT 속성을 retain에서 copy으로 변경하십시오. 그렇게하면 변경 가능한 문자열이 전달되면 유지되는 대신 복사됩니다 (변경되지 않는 문자열은 그대로 유지됩니다).

+0

이봐, 나도 해봤지만 여전히 충돌이 ... – Eli

+1

"문제가 발생했다."문제를 해결하는 데별로 도움이되지 않습니다. 결과 스택 추적을보고 * 무엇이 충돌하는지 알아보십시오. 어떤 라인? EXC_BAD_ACCESS를 얻으면 잘못된 포인터를 역 참조하기 때문에 포인터가 무엇이고 어떻게 잘못되었는지 알아 낸다. – Caleb