2013-08-26 2 views
1

데이터를 저장하는 데 처음으로 개체를 만들려고하는데 문제가 있습니다. 나는 이것이 올바른 방향으로가는 것을 확신하지 못한다.NSObject 용 게터/설정자

song.h : 나는

객관적합니까 self.songID = p_songID으로 songID을 설정할 수 없습니다 예를 들어

#import "Song.h" 

@implementation Song 


-(void)setSongID:(NSString*) p_songId;{ 

} 
-(void)settitle:(NSString*) p_title{ 

} 

-(void)setartist:(NSString*)p_artist{ 

} 
-(void)setalbum:(NSString*) p_album{ 

} 
-(void)setlength:(NSString*) p_length{ 

} 
-(void)setvotes:(NSString*) p_votes{ 

} 

-(NSString*)getSongID{ 

} 
-(NSString*)gettitle{ 

} 
-(NSString*)getartist{ 

} 
-(NSString*)getalbum{ 

} 
-(NSString*)getlength{ 

} 
-(NSString*)getvotes{ 

} 

@end 

내 구현 파일이 변수 중 하나를 볼 수 없습니다

#import <Foundation/Foundation.h> 

@interface Song : NSObject{ 
    NSString *songID; 
    NSString *title; 
    NSString *artist; 
    NSString *album; 
    NSString *length; 
    NSString *votes; 
} 
-(void)setSongID:(NSString*) p_songId; 
-(void)settitle:(NSString*) p_title; 
-(void)setartist:(NSString*)p_artist; 
-(void)setalbum:(NSString*) p_album; 
-(void)setlength:(NSString*) p_length; 
-(void)setvotes:(NSString*) p_votes; 

-(NSString*)getSongID; 
-(NSString*)gettitle; 
-(NSString*)getartist; 
-(NSString*)getalbum; 
-(NSString*)getlength; 
-(NSString*)getvotes; 

@end 

song.m, -c는 이러한 setter/getters를 다루는 방법으로 만들어졌지만 잘못된 방향으로 가고 있습니까?

+0

기호를 "속성"으로 선언하지 않았으므로 기호를 사용하여 'self'표기법을 사용할 수 없습니다. 대신 인스턴스 필드를 처리하기 위해 C++에서와 같이'self ->'를 사용해야합니다. 혼란 스럽습니다. –

+0

속성을 사용하는 경우 컴파일러에서 원하는 getters/setter를 생성한다는 것을 이해하는 것이 중요합니다. –

답변

6

목적 C는 당신이 그 (것)들에게 자신을 쓰기에 대해 걱정하지 않도록 당신을위한 getter 및 setter를 설정하는 방법이있다. 속성을 통해이를 수행합니다. 속성을 설정하려면 헤더 파일에 당신이 이유는 아니다에이 없다면 당신은 강하고 비 원자 수정을 사용합니다, 일반적으로

@property (strong, nonatomic) NSString *songID; 

물품. 관심이 있다면 다른 매개 변수를 조사 할 수 있습니다. 그 라인을 작성한 후에 게터와 세터가 생성됩니다.

클래스 내에서이 속성을 사용하려면 도트 표기법과 자체 개체를 사용하기 만하면됩니다. 예를 들어 값을 설정하려면 다음과 같이 작성하십시오.

self.songID = @"66777888"; 

동일한 방법으로 속성 값에 액세스 할 수 있습니다. 예를 들어, 값과 같은 다른 문자열을 할당, 당신은 여전히 ​​지금 클래스의 인스턴스를 사용하여 제외하고, 점 표기법을 사용

NSString *other = self.songID; 

당신이 서브 클래스의 외부에서이 값에 액세스하려면

물품. 다른 클래스에서 songID을 설정하려는 경우 예를 들어, 나는이 잘못에 대해려고하고, 목표 - C A는 이러한 세터/게터 처리의 방법으로 내장되어

Song *song = [[Song alloc] init]; 
song.songID = @"790"; 
+2

NSString (그리고 때로는 NSArray 속성)보다'strong' 대신에'copy' 식별자를 사용해야하는 경우가 더 많습니다. –

+0

에릭 (Erik)과 감사의 말을 들어 주신 Rickay에게 감사드립니다. –

+1

또한 ARC를 사용하고 자동 합성 속성을 사용하는 경우 컴파일러에서 밑줄이 접두사로 붙은 속성 뒤에 인스턴스 변수를 직접 사용할 수 있습니다. 예를 들어 songID의 값을 액세스하거나 설정할 수 있습니다 :'_songID = value' 내부 속성을 구별하기 위해 이것을 선호합니다. – atomkirk

0

접근 자 메서드의 명명 규칙은 부울 속성의 경우 가능한 한 속성과 동일한 이름을 가지며 접두사가 is 인 것입니다. 앞에는 get을 붙여서는 안됩니다. 그리고 setter는 접두어 set과 함께 대문자로 된 속성 이름으로 지정됩니다.

그래서, 당신은 할 수 있습니다

- (NSString*) title; 
- (void) setTitle:(NSString*)newTitle; 

1

을합니까 쓸 수 있습니다 방법?

예, Objective-C는 자신의 방식대로 @property입니다.

당신은 그냥 그런 속성을 선언 할 :

@interface Song : NSObject 
@property (strong, nonatomic) NSString * songID; 
@end; 

이 자동으로 생성됩니다

- (void)setSongID:(NSString *)songID; 
- (NSString *)songID; 

그래서 당신의 자신의 경로를 작성할 필요가 없습니다.

한편, strong은 개체를 소유하고 싶다는 의미이며, 귀하의 것입니다. 그리고 nonatomic은 스레드 안전성에 관한 것입니다.

@interface Song : NSObject 

@property (strong, nonatomic) NSString *songID; 
@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *artist; 
@property (strong, nonatomic) NSString *album; 
@property (strong, nonatomic) NSString *length; 
@property (strong, nonatomic) NSString *votes; 

@end 

회원 변수와 게터가/세터가 컴파일러에 의해 생성 될 때

1

당신은 단순히 당신의 클래스를 작성합니다. 당신은 구성원에 대한 세터 다음 읽기 전용 지정자 사용하는 것이하지 않는 경우 :

@property (strong, nonatomic, readonly) songID; 

을 당신은 당신이 특수 처리를해야하는 경우 게터 또는 수동 세터의 구현을 제공해야합니다. 단지 인공 예 :

@implementation Song 

void setTitle:(NSString*)title 
{ 
    if (some conditions) 
     self.votes = @"winner"; 

    self.title = title; 
} 

@end 

getter와 setter를 생성하는 컴파일러셔서뿐만 아니라 당신에게 지루한 입력을 저장하고 더 간결한 코드를 생성뿐만 아니라 동기화 및 참조 카운팅 문제를 처리한다. 모든 경우에 적용되는 것은 아닙니다. 이것은 원자 속성을 생성하거나 ARC를 사용하지 않을 경우 걱정할 필요가있는 사항입니다.

여기서 컴파일러는 속성 앞에 밑줄을 붙임으로써 멤버 변수를 생성한다는 점에 유의해야합니다. 예 : _songID 또는 _title 등. 클래스 구현 내에서 변수를 액세스하고 설정할 수 있습니다.

self.title = @"title"; 
_title = @"title"; 

어느 것이 적당합니까? self.title - 대부분의 경우 _title - 일부는 있습니다. 적용되는 경우 비 ARC 코드 및 원자 적 구현을 ​​기억하십시오.

당신이 당신의 재산을 당신에게만 접근 가능하게하고 싶다면 (개인 회원이라고도 함), 클래스 확장을 사용하십시오. 당신 구현하는 .m 파일에서 :

@interface Song() 
@property (strong, nonatomic) foo; 
@end 

@implementation Song 
... 
@end 

그리고 완전성에 대한 당신 만 게터 또는 세터 '개인'을 만들 수 있다는 것을 추가 할 것입니다.

+0

은 /는/일 수 있습니다. 컴파일러가 getter, setter 및 backing 변수를 생성하려면 구현 섹션의 속성을 여전히'@ synthesize '해야합니다. – cHao

+1

@cHao : 아니오, 컴파일러는 이제 대부분의 경우 [자동으로 합성합니다] (http://stackoverflow.com/questions/9368676/under-what-conditions-is-synthesize-automatic-in-objective-c). –

+0

@KurtRevis : 좋아, 이제는 멍청이야. :) 더 많은 상용구 쓰레기를 점점 더 많이 제거하고있는 것이 좋다. – cHao