2014-02-25 7 views
2

Obj-C를 잠시 동안 배웠습니다. 근본적인 질문이 있습니다. 내 코드에는 너무 많은 수의 '자아가있는 것 같습니다. 변수를 선언하고 사용하는 두 가지 방법의 차이점에 대한 기본적인 질문에 이르기까지라고 생각합니다.@property와 인스턴스 변수를 언제 사용하는지 알고 싶습니다

내 질문을 지원하는 일부 코드가 첨부되어 있습니다. 여기에는 두 개의 변수가 선언되어 (다른 위치에서) 메소드에서 동일한 작업을 수행하는 데 사용됩니다 (optionA 및 optionB). 어느 것을 사용해야할지 모르겠습니다. 나는 optionB와 같이 "property"를 사용했기 때문에 접근 자 (setter 및 getter)를 얻을 수 있다고 생각 했었지만 optionA에는 setter가있는 것으로 보입니다.

필자는 옵션 A를 선호합니다. 왜냐하면 모든 곳에서 "자기"가 필요하지 않기 때문에 나는 하나의 옵션을 사용하는 의미를 이해하고자합니다.

내가 작업하고있는 프로그램에서 모든 변수가 속성 (아래의 옵션 B)으로 선언되지만 액세스 할 때 '자체'를 사용해야합니다. 그게 적절하고, 일을 제대로 수행하는 방법의 유물인지, 아니면 제가 완전히 벗어 났고 optionA와 같은 다른 형식을 사용해야하는지 궁금합니다.

누군가가 인터페이스의 중괄호 (예 : optionA) 사이에서 변수를 선언하는시기는 언제입니까?

나는 대답 한 질문을 통해 찾았지만, 여기서 내가 배우려고 노력하는 것을 말해주지 못한다. 하지만 나는 다른 질문이나 답변에서 내가 찾고있는 정보를 찾을 수 없다.

나는 여기에 코드의 사진을 가지고 (그러나 나는 분명히, 명성 포인트가이 메시지에 직접 연결하도록 허용 할 필요가 없습니다) : http://i1127.photobucket.com/albums/l631/GenericImage/headerQueryOBJC.jpg

여기

목록은 다음과 같습니다

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSTextField *optionA; 

} 

- (IBAction)happy:(id)sender; 
@property (assign) IBOutlet NSWindow *window; 
@property (weak) IBOutlet NSTextField *optionB; 
@end 

구현

특성의 사용에 해당 여기서 많은 시나리오가 있습니다
#import "AppDelegate.h" 

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
} 


-(IBAction)happy:(id)sender 
{ 
    [optionA setStringValue:@":-)"]; 
    [[self optionB] setStringValue:@":)"]; 
} 

@end 
+0

감사 바이킹! 서식을 어떻게 수정 했습니까? 나는 내가해야 할 일을 잘 이해하지 못했습니다 ... – ObjCLearner

+1

코드의 모든 라인을 선택하고 편집기에서 코드 버튼을 누르면 코드가 사용자를 위해 포맷됩니다. (실제로 각 줄 앞에 4 칸 씩 넣는 방식으로 코드를 포맷하는 것이지만 편집자가 대신 할 수 있으므로 그렇게하지 않아도됩니다.) – Chuck

+0

감사합니다. 척! 나는 그 기술을 다음에 시도 할 것이다. 나는 혼란 스러웠고 백틱 (back-tick)과 여덟 칸을 사용하려고 노력했다 ... 아무 소용이 없었다. – ObjCLearner

답변

1

변수을 사용합니다.

변수 & 속성이 사용자 인터페이스 개체 (IBOutlet)를 참조하고 인터페이스 작성기에 연결되어있는 시나리오에서 변수가 같은 (사과의 전문 용어 또는 컨트롤러) 소유자의 라이프 사이클 전반에 걸쳐 객체

시나리오에 영향을 미칠 수있는 것들 중 일부는 다음과 같습니다
- ARC
의 사용 - 속성 수정이 (할당 사본. ..)
- 바인딩

ARC를 사용하는 경우 차이점이 분명하게 보이지 않을 가능성이 큽니다. 그러나 ARC를 사용하지 않고 'copy'또는 'assign'한정자가있는 속성을 사용하면 차이점을 볼 수 있습니다. 이 예에서

@property (retain) NSString *string; 

string = someOtherString; 

, someOtherString을 할당하기 전에, 속성에 연관된 아이바는 이전 내용에서 분리 (및 유지 카운트가 감소된다). 속성을 사용하지 않았다면 각 할당에서 retaincount를 처리하여 할당 취소 된 메모리에 쓰지 않아야합니다.

다른 예 : 프로젝트에서 바인딩을 사용하면 ivars를 사용하는 것이 KVC/KVO와 호환되지 않기 때문에 충분하지 않다는 것을 알 수 있습니다.

결론 : 당신이 기본 개념을 이해하면, 당신은 알 수있을 것이다 때 속성과 동일변수.

+0

감사합니다. 내 질문과 관련된 더 많은 답변 (사이트 및 여기 저기)을 읽으면서 나는 의심의 여지없이 내 문제의 일부인 "기본 개념을 이해하지 못했다"는 사실이 분명합니다! 나는이 질문을 아직 삭제할 수 있습니다 ... – ObjCLearner

+0

귀하의 질문에 정중하게 작성된, 그래서 그것을 떠날 것입니다. – Merlevede

+0

원래 쿼리의 목적을 위해, 위 예제는 optionA 또는 optionB 중 하나를 사용할 수있을 정도로 견고합니까? 즉. 위의 optionA 기술을 구현하여 악의적 인 습관을 개발하거나 Apple의 의도 된 언어 사용에서 벗어날 수 있습니까? 저는 전문적으로 프로그램을 작성하지는 않습니다. 그래서 결과는이 게임의 모든 단계에서 내 것입니다. 내가하고 싶은 한 가지 일은 필자가 작성한 더 큰 프로그램을 복제하고 변경 사항을 구현 한 다음, 앞으로 나아갈 때 비교하고 대조하는 데 사용할 수있는 두 가지 버전을 사용하는 것입니다. 생각? – ObjCLearner