2

データを保存するオブジェクトを作成しようとするのはこれが初めてで、問題が発生しています。これについて正しい方法で行っているかどうかはわかりません。

song.h:

#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

歌.m

#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

私の実装ファイルはどの変数も見ることができません。たとえば、songID を次のように設定することはできません。self.songID = p_songID

Objective-C には、これらのセッター/ゲッターを処理する方法が組み込まれていますか?これは間違った方法で行っていますか?

4

4 に答える 4

7

Objective C には、getter と setter を設定する方法が用意されているため、それらを自分で作成することを心配する必要はありません。プロパティを通じてこれを行います。プロパティを設定するには、ヘッダー ファイルに次のように記述します。

@property (strong, nonatomic) NSString *songID;

通常、使用しない理由がない限り、strong および nonatomic 修飾子を使用します。興味があれば、他のパラメータを調べることができます。その行を書いた後、ゲッターとセッターが生成されます。

このプロパティをクラス内で使用するには、ドット表記と self オブジェクトを使用するだけです。たとえば、値を設定するには、次のように記述します。

self.songID = @"66777888";

同じ方法でプロパティの値にアクセスします。たとえば、値に等しい別の文字列を割り当てるには、次のように記述します。

NSString *other = self.songID; 

サブクラスの外部でこれらの値にアクセスする場合は、クラスのインスタンスを使用する場合を除いて、引き続きドット表記を使用します。たとえば、別のクラスから songID を設定する場合は、次のように記述できます。

Song *song = [[Song alloc] init];
song.songID = @"790";
于 2013-08-26T00:32:09.027 に答える
1

Objective-C には、これらのセッター/ゲッターを処理する方法が組み込まれていますか?これは間違った方法で行っていますか?

はい、Objective-C には独自の方法があります@property

そのようなプロパティを宣言したいだけです:

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

これにより、自動的に生成されます:

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

したがって、自分で作成する必要はありません。

ちなみに、strongはオブジェクトを所有したいという意味です。それはあなたのものです。そしてnonatomic、スレッドセーフについてです。

于 2013-08-26T00:35:21.577 に答える
1

クラスを次のように書くだけです

@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

メンバー変数と getter/setter は、コンパイラによって生成されます。メンバーのセッターが必要ない場合は、読み取り専用指定子を使用します。

@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

完全を期すために、ゲッターまたはセッターのみを「プライベート」にすることができることを付け加えておきます。

于 2013-08-26T00:36:17.357 に答える
0

アクセサー メソッドの命名規則では、getter の名前はプロパティと同じである可能性があり、ブール型のプロパティの場合は、プレフィックスis. 接頭辞を付けないでくださいget。また、セッターは、プレフィックスのset後に大文字のプロパティ名を付けた名前になります。

だから、あなたは持っているかもしれません:

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

等。

于 2013-08-26T00:31:37.003 に答える