2010-07-28 7 views
0

2 가지 기본적인 설명이 필요합니다.데이터 회원 및 알림 보유

@property (nonatomic,retain) NSString* stringInstanceVariable; 

내 방법 중 하나, 나는 어떤 문자열로 stringInstanceVariable을 초기화 할 :

1.

내가 회원이 같은 선언이있는 클래스 A가 있다고 가정 할 수 있습니다. 보관해야하나요하지 않습니까?

나는 호출해야합니다 :

stringInstanceVariable = [[NSString stringWithCString:"Hello"] retain]; 

또는

stringInstanceVariable = [NSString stringWithCString:"Hello"]; 

아니면 내가 호출해야합니다 :

self.stringInstanceVariable = [NSString stringWithCString:"Hello"]; 

2.

내가 마우스 오른쪽 버튼을 클릭하면, 인터페이스 빌더를 사용하여 텍스트 공동 예를 들어, ntrol 메소드의 목록을 얻습니다. 정확히 그게 뭐야? 관찰 등록을위한 알림? 그리고 구현할 수 있고 IB를 사용하여 연결할 수 있다는 것을 알고 있습니다. 단지 코드를 사용하여 IB없이이 작업을 수행 할 수 있는지, 예를 들어 알고 싶습니다. 아마도 "addTarget : action : forControlEvent"를 사용하여이를 수행 할 수 있습니다.

하지만 그렇다면 코코아에서 이벤트와 알림의 차이점은 무엇입니까? 또는 위임과 비교하는 것이 더 적절합니다.

답변

0

두 번째 질문에 답하기 위해 대표자가 구현할 것에 동의하는 종류의 "계약"(지정 가능한 경우가 아니면 선택 사항)을 지정하는 UITextFieldDelegate protocol이 있습니다.

인터페이스 빌더에서보기 컨트롤러를 텍스트 필드의 delegate으로 연결합니다. 보기 컨트롤러를 위임자로 만드는 것은 상황이 발생할 때 호출되거나 텍스트 필드에 대해 호출되는 뷰 컨트롤러에서 비 선택적 메서드를 설정하는 것에 동의한다는 것을 의미합니다.

예를 들어, 사용자가 텍스트 필드에서 텍스트 편집을 시작할 때 대리자의 -textFieldDidBeginEditing 메서드가 호출됩니다. 필드의 텍스트 내용이 변경 될 때 추적하는 것이 유용 할 경우 여기에 코드를 넣습니다. 당신이 (선택적으로) 구현할 수있는 다른 델리게이트 메소드가 있습니다.

위임 패턴은 iOS 개발에 유비쿼터스합니다. 테이블 뷰가 또 다른 좋은 예입니다. 컨트롤러 클래스를 UITableView 인스턴스의 대리자로 설정합니다. 컨트롤러에는 테이블보기에있는 행 및 섹션의 수와 셀 내용을 지정하는 여러 가지 비 선택적 대리자 메서드가 포함되어 있습니다.

알림은 대개 다른 개체의 대리인으로 설정되는 개체의 인스턴스가 하나만 있다는 점에서 대리인과 다릅니다. 알림은 여러 객체가 다른 객체에서 발생하는 것을 수신 할 수있게하려는 경우에 유용합니다. 노 티피 케이션 센터는 등록 된 개체가 알림을 수신 대기하도록 알림을 브로드 캐스트합니다. 그런 다음 등록 된 객체는 알림을받을 때 메소드 (Objective-C에서 "selector")를 실행하는 것에 동의합니다.

+0

안녕하세요. 답변 주셔서 감사합니다. 그러나 실제로 텍스트 필드 컨트롤을 마우스 오른쪽 단추로 클릭 할 때 "이벤트"섹션에 대해 구체적으로 이야기하고있었습니다. 예를 들어, "편집을 시작했습니다"라는 메서드가 있습니다 ( ). 하나는 "터치 다운"입니다. 첫 번째 메시지가 위임 메시지와 비슷한 경우 왜 둘 다 필요합니까? 나중에, "delegate"처럼 구현 된 모든 것들을 볼 수 있습니다.이 경우에는 각 메소드를 다른 뷰 컨트롤러 클래스 구현에 전달할 수 있습니까? – Idan

0

실제로는 -stringWithCString이 사용되지 않습니다.

당신은 UTF-8이어야에서 먹이를하든 C 문자열 null로 끝나는 문자열과 NSStringEncoding 유형, 예컨대 :이 예에서

self.stringInstanceVariable = [NSString stringWithCString:"Hello" encoding:NSUTF8Encoding]; 

를 제공, -stringWithCString:encoding:를 사용하는 것이 좋습니다. 응용 프로그램에 따라 다른 인코딩이있을 수 있습니다.

self을 사용하여 해당 속성의 설정자에 액세스 할 수 있습니다.

속성은이 점을 감안하여 retain을 지정할 필요가 없습니다. 당신이 -initWithCString:encoding을 사용하여, NSString 설정하는 alloc-init를 사용한다면

그러나, 당신은 그것을 autorelease를해야합니다, 예를 들면 :

self.stringInstanceVariable = [[[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding] autorelease]; 

이에 (메모리 관리의 측면에서) 동일합니다 :

NSString *_tempString = [[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding]; 
self.stringInstanceVariable = _tempString; 
[_tempString release]; 

이 조금 복잡해진다하지만 더 많은 코드가 비록 명시 적으로는 stringInstanceVariable에 의해 유지 된 직후 _tempString를 방출하는 일부는이 후자의 방법을 선호 . 전자의 접근 방식에서는 autorelease이 결국 임시 변수를 공개 할 예정이지만, 메모리 프로파일을 엄격하게 유지하려는 경우 후자의 접근 방식을 고려해야합니다.

+0

'-stringWithCString : encoding :'과'NSUTF8Encoding'을 더 짧게 대체하면'[NSString stringWithUTF8String : "Hello"]'가됩니다. –

+0

짧은 코드가 더 나은 경우가 많습니다. UTF-8로 인코딩 된 문자열을 항상 다루는 것은 아니기 때문에 더 긴 방법에 대해 알아두면 좋습니다. –