이런 에러가 생겼을 경우

Here are some things that can fix this (in increasing order of difficulty):

  • Clean the project (Product > Clean)
  • Completely close Xcode and restart your project.
  • Delete the Derived Data folder (Window > Projects > click Delete button by Derived Data.) (Update: In Xcode 8 this location no longer appears. Supposedly Xcode cleans up Derived Data by itself. If you want to delete it manually you can find the folder yourself by going to Preferences > Locations and clicking the gray arrow by the Derived Data folder. Then delete your project folder.)
  • Click delete on the class, remove reference (not Move to Trash), and add it back again. (see this answer)


Posted by 知彼知己百戰不殆
,


XCode 8.2.1 버전에서 코드를 작성하다가 빌드 시 오류가 난 부분이다. 구글링을 해보니 'Garbage collection이 기본으로 설정되어 있어 소스상에서 레퍼런스 카운트를 이용한 메모리 관리 방식의 키워드를 사용하면 아래와 같이 에러가 난다'라고 한다.

이런 경우 XCode의 프로젝트 네비게이터에서 프로젝트의 이름을 클릭하면 속성화면이 나오는데 여기서 Build Settings의 'Objective - C Automatic Reference Counting'값이 아래와 같이 'Yes'로 되어있는 것을 'NO'로 수정해주면 에러없이 빌드가 가능해진다. 라고 써있으나.... 내 XCode에는 그런 속성이 없었다. 그래서 재구글링을 통해 알아본 결과 

[obj release]열만 제거를 하면 된다길래 [[SecondViewController new] autorelease];에서 autorelease를 제거하여 [SecondViewController new]만 남겨놓았더니 오류없이 빌드가 됐다.








Posted by 知彼知己百戰不殆
,

viewDidUnload

언어/Objective - C 2017. 3. 17. 10:06

viewDidUnload 메서드는 Memory Warning Memory Warning 메시지를 시스템에서 현재 활성 중인 프로그램에게 전달하면 iOS delegate 메서드 중에 viewDidUnload 호출하도록 한다.

해당 화면이 다시 그려질 필요가 있을 viewDidLoad메서드가 호출되고 다음이 viewWillAppear 메서드 호출 순으로 가게 된다. 따라서 다시 내용을 불러오려면 viewDidLoad 오버라이딩 해서 처리하면 된다.


viewDidUnload 메서드에서 주로 작성해야 내용은

먼저 First Responder 뷰가 아닌 뷰들과 관계하여 굳이 메모리에 유지 되어야 필요 없는 IBOutlet들을 해제해주면 좋다

)

- (void)viewDidUnload {

self.nameField = nil;

self.numberField = nil;

self.sliderLabel = nil;

self.leftSwitch = nil;

self.rightSwitch = nil;

self.doSomethingButton = nil;

[super viewDidUnload];

}


self.nameField = nil 의미는 [self setNameField:nil] 같은 의미이다. ,


- (void)setNameField:(UITextField *)_param_nameField {

[_param_nameField retain];

[nameField release];

nameField = _param_nameField;

}

이런식으로 세터가 자동으로 구성되어지므로 self.nameField 무사히 nil 할당 받는다.

viewDidLoad 메서드는 nib 파일로부터 해당 뷰들이 모두 메모리에 load 후에 호출되는 메서드이다.

viewDidUnload 기본적으로 UIControlView 관련한 객체들에 대한 메모리 관리를 위한 메서드이지 모든 객체들에 대한 메모리 할당 해제 관리를 책임지기 위한 메서드가 아니다. 오로지 IBOutlet 객체에 대해서만 메모리 관리를 해주는 메서드로 이용하자.

메서드를 마치 iPhone 내에 virtual Memory 제어 하듯이 쓰지 말자. 분명히 여기저기 탈나고 코드가 못생겨진다.


viewDidUnload 메서드에서 객체들을 nil처리 있는 것은 나중에 다시 화면에 그려질 필요가 있을 viewDidLoad에서 이전에 값을 인지할 필요 없이 초기화할 있는 객체들만 가능하다

가장 쉬운 예가 nib파일에 있는 내용으로 메모리 부족으로 warning system call 오면 nib 파일에 해당 내용이 있으므로 간단하게 할당 해제해줘도 나중에 필요시 nib파일에서 다시 로드시키면 된다.


하지만 이전 값을 반드시 기억해야 하는 경우는 따로 디스크에 deep copy 하지 않는한 불러오는 것은 불가능하기 때문에 일률적으로 nil처리 하면 다시 찾아올 방법이 없다.

Posted by 知彼知己百戰不殆
,