2011-01-05 4 views
3

죄송합니다. noobie 질문과 같은 질문이 있으시면 ObjC와 iOS에 비교적 익숙하지만 소프트웨어 개발에 익숙하지는 않습니다. 주제에 대해 잘 모르겠다는 문구가 들리면 다음 용어에 대한 간단한 설명을 주려면 잠시 시간을 내 주시겠습니까?이 질문에 대한 답변 Objective-C/iOS

나는 아래에 나열된 용어들과 함께 붙어있다. 그리고 나는 그것이 내가 의미하는 것이라고 생각한 것, 즉 애플의 문서의 흐름을 더 잘 따를 수 있도록 나를 수정하는 데 도움이된다고 생각한다.

1) 싱글

PHP에서 완전히 정적 클래스에 아마 비슷한

, 아니 인스턴스 메소드

이 없습니다

2) 모델, 뷰, 컨트롤러 (MVC) 조직 - 특히 '모델'구성 요소

넓은 정의는 물건을 분리 상태로 유지한다는 것을 알고 있습니다.이 생각은 프로그래머블 또는 인터페이스 빌더에서 화면으로 출력하기 위해 빌드 한 것이고 컨트롤러는 메시지 (클릭 수, 탭 수를 처리하는 코드입니다. 등)을 표시하고 많은 경우에보기로 정보를 푸시합니다. 폼과 컨트롤러를 구성하는 .xib와 .h/.m 쌍은 같은 패밀리의 일부입니다 (즉, MyViewController.h/.m/.xib). 내 추측의 모델은 소스에서 데이터를 읽고 쓰는 별도의 핸들러입니다 (예 : SQLite 데이터베이스 또는 XML 피드에서 데이터를로드하고 반환 할 수있는 메시지를 보내는 클래스).

3) 개체 유형에 대해 이야기 할 때 *의 올바른 위치는 어디입니까?

NSString *myVar; 
NSString* myVar; 
NSString * myVar; 

나는이 * 헤더 예 : 메시지에 입력 한 후 간다 이해 :

그들은 같은 뜻처럼 나는 * 포인터를 의미 알고 있지만 내가 찾고 아래와 같이 기록 된 것을 본 적이 :

- (void)myMessageHandler:(NSString *)str; 

4) NSInteger와 평범한 int를 사용하는 경우는 언제입니까?

이것은 나를 바보처럼 보이게 할 수도 있지만, 언제 사용해야하는지 잘 모르겠다. 그리고 혼합 된 여러 가지 예를 볼 수있다.

5) 재사용 가능한 엔티티 식별자

디 queing은/재사용 큐를 통해 작동 객체를 생성, I는 "cellIdentifier"@ 2있는 UITableViewCell 각 시간 (예를 사용하여 동일한 동일한 식별자를 참조

). 그러나 내가 보는 것은 대기열에 단순히 저장되는 대신 관련 행 데이터로 셀이 재설정된다는 점입니다.이 혼란은 각 행을 주소 지정하는 HTML의 표에서 나옵니다. DOM을 트래버스하거나 ID 태그를 추가합니다. 각 행은 고유합니다.

저는 이것이 기본 클래스를 사용하는 경우 실제로 어떤 일이 일어나는지 알지 못하게하는 메모리 관리 작업이라고 생각하지만 다른 사용자 정의 클래스를 사용하는 경우 각 유형 중 하나를 인스턴스화한다고 가정합니다 부모 클래스 인스턴스 (예 : UITableView)마다 매번 속성을 재설정하더라도 필요한 총 메모리가 최소화되고 인스턴스화 시간이 한 번만 수행되므로 루프에서 제거됩니다.

이 질문에 대한 2 부는 여러보기 컨트롤러가 서로 밀어 붙인 경우 특정보기와 관련된 고유 식별자를 사용하는 것이 좋을 수 있으므로 사용자 지정 하위 클래스를 사용하는 경우, 식별자는 오버랩과 아마도 메모리 누수를 일으키지 않을 것입니다.

예 : UITableView는 주석이 선택 될 때 UITableView를 푸시하는지도를 푸시합니다. 두 셀에서 재사용 가능한 ID 이름으로 'cellIdenfier'를 사용하지만 두 번째 셀은 UITableViewCell에 대한 맞춤 클래스를 사용했습니다. 상위보기로, 시스템이 잠재적으로 나를 대기열에서 잘못된 유형을 반환하지 않을 것이고 약간 이상한 결과가 발생합니까?

+2

리소스로 스택 오버 플로우의 문제를 해결하기 때문에 실제로 한 번에 하나의 질문 만 게시해야합니다. :-) –

+0

죄송합니다, 나는 5 개의 동시 게시물이있는 시스템을 어수선하게 만들 것이라고 생각하지만, 함께 그룹화하면 필요한 질문에 완전히 답하기 위해 필요한 기술을 가진 사용자를 끌어 들이지 않을 수도 있습니다. 나는 앞으로도 별도의 게시물을 작성하는 것을 잊지 않을 것입니다. – JamesB

+1

질문 3에 대한 답변에서 그 중 하나는 문제가 없습니다. 필자는 이름 옆에있는 오른쪽으로 선호합니다. 포인터가 그 타입보다 더 포인터라는 사실을 연관시키기 때문입니다. –

답변

1

middaparka가 말했듯이 질문을 나누어야하지만 1-3 번 답변을 드릴 수 있습니다.

싱글 톤은 전체 프로그램에서 클래스의 인스턴스가 하나만있는 디자인 패턴입니다. 대개 정적 인 getInstance 메서드로 구현되며 기존 인스턴스를 반환하거나 (정적 변수로 저장 됨) 존재하지 않는 경우 새 인스턴스를 만듭니다. 디자인 패턴에 대한 좋은 참고 자료는 그것을 다루어야한다.

MVC의 경우 모델 아이디어는 근본적으로 정확합니다. 모델은 데이터가 저장되는 곳입니다. 다시 말하지만, 자세한 내용은 디자인 패턴 참조를보십시오.

*가 어디로 가는지에 관해서는, 컴파일러가 어떤 방법을 받아들이 기 때문에 대부분 스타일의 문제입니다. 필자는 개인적으로 타입 옆에 넣는 것을 선호하지만, 기술적으로 타입의 일부이기 때문에, 대부분의 장소는 식별자 옆에 놓았습니다. 나는 식별자의 옆에 두는 것에 대한 이론적 근거는 포인터를 역 참조하는 것인데,이 경우 포인터를 변수와 그룹화하는 것이 의미가 있으며 시각적으로 일관성있게 만들고 싶다고 생각한다. 곱셈 연산자로 사용할 때 * 주변의 공백 만 보았습니다.

+0

Karl, 진흙 중 일부를 지워 줘서 고마워. 나중에 조언을 받아서 4와 5를 별도의 질문으로 다시 게시하고 mvc 디자인 패턴을 검색하여 더 잘 읽을 것입니다. 나는 또한 답변을 찾고있는 다른 독자들이 따라하기 힘든 체인을 발견 할 수 있기 때문에 분할 질문에 대한 필요성을 완전히 이해하고 있습니다. 교훈은 제 친구들을 잘 배웠습니다. – JamesB

+0

@JamesB : 해당 부분을 다시 게시 할 때 사람들이 나중에 유용한 답변이있는 곳을 쉽게 찾을 수 있도록 여기에서 해당 부분을 삭제하는 것을 잊지 마십시오. –

3

답변을 수락 했어도 완료되지 않았으므로 추가하겠습니다.

Karl의 싱글 톤 정의는 제가 염려하는 한 돈을두고 있습니다.

모델은 데이터를 저장하는 객체 일뿐만 아니라 비즈니스 로직이기도합니다.

*가 어디로 가는가에 대해서는 스타일의 문제이지만, C의 유형 (Objective-C는 수퍼 집합 임)의 일부라고 말하는 것은 미묘한 잘못입니다. 이것은 쉽게 다음에 설명된다 : 그것은 두 가지 유형 int*의 변수 만의 int (foo는)에 대한 포인터와 INT (막대)를 선언하지 않는

int* foo, bar; 

. 그래서 기술적으로는입니다. 변수 이름에는 *를 넣어야합니다. 그러나 Karl과 동일한 규칙을 사용하고 쉼표로 구분 된 목록에 변수를 선언하지 않으므로 위의 문제를 피할 수 있습니다.

NSInteger와 일반 int를 사용하는 경우는 언제입니까?

언제든지 Cocoa API 문서를 통해 사용해야한다고 말할 수 있습니다. 그렇지 않으면 평범한 int와는 반대로 사용하는 것이 전혀 이점이 없습니다. int 타입의 특정 너비를 보장해야한다면 stdint.h (int32_t, int64_t 등)의 C99 표준을 사용해야합니다. 특정 너비를 보장 할 필요가 없다면 Cocoa API가 NS (U) Integer를 제공하는 경우를 제외하고 내장 된 유형을 사용할 수도 있습니다.NS (U) Integer를 (unsigned) int로 캐스팅하면 일부 아키텍처 (예 : x86_64)에서이를 잘라낼 위험이 있습니다.

재사용 엔티티 식별자

jQuery과는 현재 화면에 표시되는 모든 셀에 대해 하나 개의 인스턴스를 필요로한다. 셀 인스턴스화는 비용이 많이들 수 있습니다 (예를 들어 NIB를로드하기 위해 디스크로 이동해야 할 수도 있음). 따라서 셀이 보이지 않으면 셀을 버리는 대신 테이블 뷰에서 셀을 버려진 큐에 넣습니다. 처음부터 새로 인스턴스화하는 것보다 새로운 것을 필요로 할 때 대기열에서 사용되지 않는 셀을 당기는 것이 훨씬 빠릅니다.

테이블보기에 다른 유형의 셀이있을 수 있으므로 재사용 식별자가 필요합니다. 예 : 한 행에는 텍스트 필드가 있고 다른 행에는 날짜 선택 도구가있을 수 있습니다. 따라서 테이블 뷰가 텍스트 행의 셀을 요청하면 날짜 선택 도구가있는 셀을 제공하는 것이 좋지 않을 것입니다.

+0

환상적이므로, NSInteger와 int, 인스턴스 메소드, 델리게이트 프로토콜 등이 NSInteger를 지정했다면, 이해해야합니다. 그렇지 않으면 사용하십시오. 식별자의 경우 테이블의 모든 셀이 동일하면 동일한 식별자가 좋으며 다른 유형의 데이터 나 뷰인 경우 다른 식별자를 사용하십시오. 내가 옳다면 그것은 완벽한 의미입니다. – JamesB

+0

@JamesB : 모두 맞습니다. – JeremyP