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

では、1 番目と 2 番目の使用の違いを説明してください。

アドバイスありがとうございます!

4

3 に答える 3

2

{} 括弧内の変数はインスタンス変数です。クラスのみがアクセスできます。

@property は、(オプション) で示されるいくつかの異なるものを定義します。

ほとんどの人は @property を使用して、.m および .h ファイル内の便利なメソッドを使用します。例えば

@property (strong) NSString *string;

.h および .m ファイル内に 2 つのメソッドを作成しますが、あなたには見えません。

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

つまり、可読性が向上し、定型コードの多くを削減するのに役立ちます。

{} 括弧内でインスタンス変数を定義する必要はなくなりました。

インスタンス変数を別の名前に設定する必要がある場合は、

@synthesize string = _string;

あなたはこれに慣れていないので、あなたが考えるためにいくつかのボーナスを追加します. self.string = @"string" string = @"string" と同等の呼び出しではない可能性があります

@property (強い) NSString *string; がある場合 および @synthesize 文字列。この理由は、self.string を介して文字列を設定するためです。メソッドの実装を使用して文字列を設定しており、次のようにオーバーライドされる可能性があります。

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

したがって、self.string = @"hello" は @"hello.jpg" になりますが、string = @"hello" は単なる "hello" です。

また、self.string = @"string"; [self setString:@"string"]; とほとんど同じです。

@property(strong)NSString *string が .h 内で何をするかを明確にするために、次を追加します。

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

内部.m:

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

-(NSString *)string{
return _string;
}

したがって、iVar の名前を別の名前に変更したい場合を除き、@synthesize を呼び出す必要はありません。

したがって、.hでは次のようになります

{
NSString *wibblyWobblyTimeyWimey;
}

.m の内部

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

-(NSString *)string {
return wibblyWobblyTimeyWimey;
}
于 2013-09-01T12:18:41.277 に答える
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
于 2013-09-01T12:04:06.513 に答える