2013-09-01 5 views
2

저는 iOS 개발에 익숙하며 어떤 경우에 대한 이해에 어려움이 있습니다. 내 질문에 변수와 속성이 동시에 필요합니까? 내가 아는 한 나는 변수 자막 여전히 사진 작가 코드가 작동 삭제하면,변수와 속성이 동시에 필요합니까?

#import <Cocoa/Cocoa.h> 

@interface Photo : NSObject { 
    NSString* caption; 
    NSString* photographer; 
} 
@property (retain) NSString* caption; 
@property (retain) NSString* photographer; 

@end 

:하지만 그래서

#import <Cocoa/Cocoa.h> 

@interface Photo : NSObject 

@property (retain) NSString* caption; 
@property (retain) NSString* photographer; 

@end 

에게,

예를 들어이 같은 코드를 보았다 첫 번째 및 두 번째 사용의 차이점을 설명하십시오.

감사합니다.

답변

2

{} 괄호 안에있는 변수는 인스턴스 변수입니다. 그들은 수업에만 접근 할 수 있습니다.

@property는 (옵션)으로 표시된 몇 가지 다른 것들을 정의합니다.

대부분의 사람들은 .m 및 .h 파일 내부의 편리한 메소드에 @property를 사용합니다. 예를 들어

@property (strong) NSString *string; 

라는,하지만 당신에게 보이지 않는 당신의 .H와하는 .m 파일 내의 두 가지 방법을 작성합니다 :

-(NSString *)string; //returns the string object 
-(void)setString:(NSString *)string; 

그래서 그것이 무엇을하는 것이 가독성을 향상하고 보일러 플레이트를 많이 줄일 수 있습니다 암호.

더 이상 인스턴스 변수를 {} 괄호 안에 정의 할 필요가 없습니다.

다른 이름으로 인스턴스 변수 세트가해야 할 경우 새로운 것 때문에 당신이 생각하는이 아픈 일부 보너스 물건을 추가로 당신은

@synthesize string = _string; 

를 넣을 수 있습니다. 는 self.string = @ "문자열" 는 문자열로 해당 호출되지 않을 수 = @ "문자열"

당신이 @property (강한) * 캐릭터는 NSString이있는 경우; 및 @ 문자열을 합성합니다. 이것에 대한 이유는 문자열을 설정 메소드 구현을 사용 self.string를 통해 문자열을 설정하고 다음과 같이 오버라이드 (override) 할 수 있습니다

-(void)setString:(NSString *)str{ 
    string = [NSString stringWithFormat:@"%@.jpg", str]; 
} 

그래서 self.string = @ "안녕하세요"가 될 것이다 @ "안녕하세요 .jpg "여기서 as string = @"hello "는 단지"hello "입니다.

또한 self.string = @"string "; [self setString : @ "string"]과 거의 같습니다.

무엇 @property에 대한 명확한

(강력한)는 NSString * 문자열이하는 .H 내부 는 추가 :

-(void)setString:(NSString *)string{ 
_string = string; 
} 

-(NSString *)string{ 
return _string; 
} 

그래서 호출 할 필요가 없습니다 :하는 .m 내부

{ 
    NSString *_string; 
} 
-(void)setString:(NSString *)string; 
-(NSString *)string; 

iVar의 이름을 다른 것으로 바꾸지 않으려면 @synthesize를 사용하십시오. @synthesize string = wibblyWobblyTimeyWimey;

그래서 .H에 명확한 대답을,

-(void)setString:(NSString *)string{ 
wibblyWobblyTimeyWimey = string; 
} 

-(NSString *)string { 
return wibblyWobblyTimeyWimey; 
} 
+0

그래서 self.string이 overriden 메서드를 호출하고 string이 default를 호출한다는 것을 알기 때문에? 또한 하나의 질문 : 합성 속성이 필요한지 아닌지? –

+0

@synth에서 어떤 일이 일어나는지 설명하기 위해 몇 가지 설명을 추가했으며 _varname을 사용하여 자동으로 수행하므로 더 이상 추가 할 필요가없는 이유는 무엇입니까? 또한 한 줄의 코드가 그렇게 많이한다는 놀라운 점은 코드를 볼 때 왜 그리 어려운지는 모르겠다는 것입니다. –

0

아니요. {}의 변수는 전용 멤버이며이 헤더 파일을 상속하는 클래스에서는 액세스 할 수 없지만 properties은 클래스를 상속함으로써 액세스, 읽기 및 쓰기가 가능합니다.

그러나 항상 그런 것은 아닙니다. 어떤 경우에는 (예 : delegates) 둘 다 필요합니다.

+0

감사하는 .m 내부

{ NSString *wibblyWobblyTimeyWimey; } 

될 것이다. 내가 알기로 대표단은 두 클래스의 관계에 필요합니까? Pleaese, 우리가 '대의원'을 사용할 때 (어떤 목적으로) 더 명확하게 이해할 때도 설명하십시오. –

+0

이것은 반드시 사실 일 필요는 없습니다. 속성은 구현 위의 .m 파일에서 @interface objectName()을 사용하여 전용 메서드로 사용할 수 있습니다. –

+0

다른 질문에 대한 대의원에 대해 물어 보거나 Google에서 찾는 것이 좋습니다. 그 주제는 아주 광범위합니다. –

1

Xcode 4.6.x를 사용하고 있고 Clang 4 이상 버전의 명령 줄 도구를 설치 한 경우 '자동 합성'속성을 이용할 수 있습니다.

@interface Photo : NSObject 

@property (retain) NSString* caption; 
@property (retain) NSString* photographer; 

@end 

_caption 및 _photographer 인스턴스 변수를 제공합니다. 따라서 대부분의 경우 인스턴스 변수를 선언 할 필요가 없습니다. ARC를 사용하는 경우 속성 만 사용하는 것이 좋습니다. 여기

는 그 코드는 ARC를 사용하는 경우 어떻게 보일지입니다 :

@interface Photo : NSObject 

@property (strong) NSString* caption; 
@property (strong) NSString* photographer; 

@end 

는 또한, 일반적으로는 nonatomic 속성을 지정하는 것이 좋습니다. 이렇게하지 않으면 clang이 생성하는 접근자가 잠금을 사용하게됩니다.

@interface Photo : NSObject 

@property (strong, nonatomic) NSString* caption; 
@property (strong, nonatomic) NSString* photographer; 

@end 
+0

감사합니다. n00bProgrammer에서 말했듯이 두 경우가 필요할 때 특별한 경우가 있습니까? 아니면 이미 _caption 및 _photographer 변수를 생성 할 것인가? –

+0

.h의 @Chika 속성은 공개적으로 공개됩니다. private 또는 internal 속성을 원한다면 구현 (.m)에서 다음과 같이하십시오 : (at) implementation Photo {(at) 속성 (강하고 비 구조) NSString * date; } – maz

관련 문제