2010-02-03 2 views
1

내 번들의 실행 경로를 가져오고 싶습니다. (그래서 나는 NSImageView에서 이미지를로드 할 수있는 경로를 얻고 싶습니다)nsbundle 번들 경로에 대한 경고

나는 이것을 얻었다.

NSString * _Ruta_APP = [[NSString alloc] init]; 
_Ruta_APP = [[NSBundle mainBundle] bundlePath]; 

하지만 컴파일러는 /ControlAPP.m:33:0 /ControlAPP.m:33 말한다 : 경고 : '_Ruta_APP'의 지역 선언은 인스턴스 변수

을 숨 깁니다하지만 난 _Ruta_APP의 값을 사용할 수 없습니다

누구나 아이디어가 있습니까? 사물의

답변

1

경로를 인스턴스 변수에 보관하려면 실제로 첫 번째 행을 삭제하십시오.

  1. 메소드에서 인스턴스 변수를 선언하지 않아도됩니다.
  2. 다른 문자열을 할당하기 전에 변수를 빈 문자열로 초기화하지 않아도됩니다.
  3. 그런 다음 인스턴스 변수 개체를 유지해야한다 : 당신이 _Ruta_APP라는 변수뿐만 아니라, 같은 이름의 인스턴스 변수를 가지고있는 것처럼

[_Ruta_APP autorelease];
_Ruta_APP = [[[NSBundle mainBundle] bundlePath] copy];

+0

이것은 하나의 속임수를했습니다 – Freaktor

+0

나는 다른 브래킷과 사본을 의미합니다. – Freaktor

+1

실제로이 답변에는 "트릭을 수행했다"는 내용이 많이 있습니다. 나는 답안과 원본 코드의 차이점에 대한 자세한 내용을 이해하려고 노력할 것을 제안한다. 그렇지 않으면 같은 오류를 반복해서 반복 할 위험이있다. – bbum

1

커플 :

대신이 시도 :

NSString* imagePath = [[NSBundle mainBundle] pathForResource @"SomeImage" ofType: @"png"] 

당신이 점점 경고 당신은 또한 당신의 코드에서 그 지역 변수와 동일한 이름을 가진 인스턴스 변수를 나타냅니다 보인다 단편.

밑줄이있는 인스턴스 변수는 아마도 애플이 숨겨진/개인용 ivars에 사용하기 때문에 나쁜 생각 일 수 있습니다. 나는 당신 자신의 코드에서 그것들을 사용하는 것이 나쁜 스타일이라고 생각한다.

+0

왜 downvotes? 이것은 좋은 대답이었다. – kubi

+0

"대신에 이것을 시도하십시오"는 "실제 오류를 해결하고 그것에 대해 배우지 마십시오"를 의미합니다. @Freaktor의 문제는 분명히 인스턴스 변수의 그림자입니다. 이 답변의 첫 번째 버전에서는 설명하지 않았습니다. 또한 개인 인스턴스 변수에 대한 마지막 사항은 잘못되었습니다. –

0
  1. 보인다. 인스턴스 변수를 사용하려는 경우 메서드 내에서 변수를 재정의 할 필요가 없습니다.

  2. 스 니핏의 첫 번째 줄은 사용하지 않는 개체와 누수 된 개체를 만듭니다.

그래서 난 그냥 SNIPPIT에서 첫 번째 줄을 제거 말하고 싶지만 및 경고 멀리 가야한다.

+0

에 복사됩니다. 하지만 내가 그것을 제거하면 경고가 사라지지 않습니다. 그것은 개체 nsbundle의 새로운 인스턴스를 얻었으며 complilator는 단지 미친 듯합니다. P – Freaktor

0

당신은 그렇게 실행 파일의 경로를 필요로하지 않는다 (나는 내가 NSImageView에서 이미지를로드 할 수 있도록 경로를 싶어). 가장 쉬운 방법은 NSImage's imageNamed: method입니다. 두 번째로 쉬운 것은 St3fan이 제안한 것입니다.이제

의 하드 방식의 구현에 문제를 통해 가자 : 당신이 alloc 그것을 만든 때문에 자신이 _Ruta_APP라는 이름의 지역 변수를 선언하고있는 NSString 객체를 개최 초기화

NSString * _Ruta_APP = [[NSString alloc] init]; 

, 그것을 공개하지 않았습니다.

_Ruta_APP = [[NSBundle mainBundle] bundlePath]; 

이 첫번째 대체 같은 변수에 다른 캐릭터 오브젝트를 둔다. 가비지 수집을 사용하고 있지 않다면 더 이상 메시지를 보낼 방법이 없어도 첫 번째 객체가 아직 살아 있고 여전히 소유하고 있습니다. 따라서, 당신은 그것을 유출했습니다.

_Ruta_APP을 인스턴스 변수로 사용하려는 경우 첫 번째 줄 전체를 잘라냅니다. 일반적으로 인스턴스 변수에서 소유하지 않은 객체를 보유하는 것은 좋지 않으므로이 객체의 소유권을 가져야합니다. 가장 좋은 방법은 복사본을 만드는 것입니다 (그렇게 한 후에 복사본을 소유하게됩니다). 인스턴스 변수에 그 복사본을 넣으십시오. 그렇지 않으면 원래 객체가 소유하고있는 것이 무엇이든 그것을 해제하면 객체는 죽을 것이나 여전히 그 객체를 보유하게됩니다. 죽은 객체에 메시지를 보내면 앱이 다운됩니다. the memory management rules을 참조하십시오.

다른 인스턴스 메서드가 아닌 _Ruta_APP을 로컬 변수로 사용하려는 경우 인스턴스 변수를 잘라냅니다.

+0

알았습니다. 몇 주 전에 객관적으로 시작했습니다. 영어는 제 집 언어가 아니므로 조언을 주셔서 감사 드리며 모든 코드를 디버깅하겠습니다. – Freaktor

관련 문제