2010-07-29 6 views
2

에 보관 자기,이로드 좋은 시도까지 어떤 시점에서 롤업을해서 나는 나쁜 접근으로 추락했다. 이것은 locationsArray가 유지되지 않기 때문입니다.내가 속성으로 정의 된있는 NSMutableArray * locationsArray을 내 .H 파일에있는 NSMutableArray

이 코드 라인이 줄의 코드도 같은 문제를 해결

locationsArray = [[Locations loadLocations] retain] (#1) 

하는 .m 내 문제를 해결

self.locationsArray = Locations.loadLocations (#2) 

나는 몇 가지 질문은 내가

에 대한 설명이 필요가
  1. 이 값을 설정하는 올바른 방법은 alloc입니다., alloc initwithArray?
  2. 자바 세계에서오고있다 나는 self이 아니면 적어도 내가 생각했던 것 ... 이없는 locationsArray이 없으면 목표가 다르다.

분명히 나는 ​​그것을 작동시키지 만, 그 이유는 무엇인지 여전히 혼란 스럽습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

1
  1. 예, 인스턴스 변수 (locationsArray)를 직접 설정 한 경우 유지하려면 값을 유지해야합니다. 이전에했던 것처럼 할 수도 있고 직접 할당/초기화 할 수도 있습니다. 이는 소유권을 가지고 있음을 의미합니다.

  2. self은 실제로 다른 OO 언어의 경우 this과 같습니다. 하지만 Obj-C에는 첫 번째 예제에서와 같이 ivar "naked"를 참조하고 두 번째 예제에서는 self.locationsArray으로 언급하는 것 사이에 의미상의 차이가 있습니다. 전자는 당신이 상상하는 방식대로 동작하지만 후자는 retain으로 속성을 표시했기 때문에 실제로 자동으로 보유를 수행하는 [self setLocationsArray: ... ]의 구문 단축키입니다.

이 마지막 지점은 정말 미묘하고 (예상치 못한) 예상치 못한 동작입니다. 여전히 모호하다면 Apple 문서로 돌아가십시오. 이것을 얻는 것이 정말로 중요합니다.

+0

이 문제의 위험을 피하기 위해 밑줄이없는 속성과 밑줄 문자가있는 ivars를 많이 사용하는 이유는 무엇입니까? – jimsis

+0

사람들이 그렇게하는 이유 중 하나입니다. 범위 마킹에 대한 일반적인 이유는 (a) 코드를 읽을 때 함수 내부에서 한 눈에 볼 수있는 것은 지역 변수이고 아이바 (itar) 란 무엇인지, 그리고 (b) 편의상 메소드가 (흔히 세터)는 같은 이름의 param을 취합니다. ivar를 숨기는 것을 피하기 위해 바보 같은'theString' 또는'anEvent'를 쓸 필요는 없습니다. Obj-C 2.0에서 getter/setter 점 표기법을 싫어합니다. 도움이되기보다는 혼란 스럽기 때문에 직접 사용하지 않습니다. YMMV. –