0

わかりました、コアデータ用に作成したクラスがあります

LoginPass.h

それから私はファーストクラスを持っています

FirstClass.h

次に、SecondClass でこのクラスを使用する必要があり、@class で宣言します。ヘッダファイル

SecondClass.h
...
@class FirstClass;
@class LoginPass;
...
    @interface SecondClass : UIViewController
  {
   ......
  }
@property (strong, nonatomic) FirstClass *fromFirstClass;
@property (strong, nonatomic) LoginPass *myEntity;
...
@end

そして.mファイルで

#import "SecondClass.h"
#import "FirstClass.h"
#import "LoginPass.h"
@implementation SecondClass
...
@synthesize fromFirstClass = _fromFirstClass;
@synthesize myEntity = _myEntity;
...

わかりました、コードでいくつかの間違いを犯す可能性があります。なぜ私が書く必要があるのか​​ 本当にわからないし、今は面白くない

 @synthesize myEntity = _myEntity;

だがしかし

 @synthesize myEntity;

しかし、別の質問があります。コードで then を使用できる理由

 self.fromFirstClass

でも使えない

 self.myEntity

Xcode でエラーが表示され、使用する必要があると言われます

 self._myEntity

違いは何ですか?self.fromFirstClass を使用できるのに、self.myEntity を使用できないのはなぜですか? @終わり

4

3 に答える 3

3

オブジェクト構造の変数部分であるインスタンス変数と、実際に値を設定および取得するためのメソッドであるプロパティを混同しています。

宣言するときは@property (strong, nonatomic) FirstClass *fromFirstClass;、実際には2つのメソッド- (FirstClass *)fromFirstClassとを宣言します- (void)setFromFirstClass:(FirstClass *)aFirstClass

ドット構文を使用する場合FirstClass *classA = self.fromFirstClass;、実際にはメソッドを呼び出します。これは。と同等FirstClass *classA = [self fromFirstClass];です。同様に、と書くself.fromFirstClass = classB;と、実際には次のように呼び出されます[self setFromFirstClass:classB];

オブジェクトメソッド内でインスタンス変数の名前を直接使用する場合は、この変数にアクセスします。

これで、最新のランタイムで記述@synthesize fromFirstClass;する場合、コンパイラーに同じ名前のインスタンス変数を作成させ、fromFirstClass2つのメソッド- (FirstClass *)fromFirstClassを記述し- (void)setFromFirstClass:(FirstClass *)aFirstClassます。これにより、インスタンス変数が取得および設定されます。

と書く@synthesize fromFirstClass = _fromFirstClass;と、作成されるインスタンス変数の名前の前にアンダースコアが付いていることを除いて、同じことが起こります。

最後に、コンパイラの最新バージョンでは、何も記述しない場合、デフォルトの動作は@synthesize fromFirstClass = _fromFirstClass自動的に行われます。

于 2012-12-21T09:16:03.380 に答える
2
@synthesize fromFirstClass = _fromFirstClass;
@synthesize myEntity = _myEntity;

上記の行は正しいですが、現在では合成する必要はありません。@synthesizeコンパイラ自体によって配置されます。

使用self.propする場合は、プロパティにアクセスしていることを意味します。

使用するとき_propは、プロパティを直接呼び出します。

編集:

使用するときはself.prop、 =(assignment) の lhs または rhs に応じてメソッドを呼び出します。

-(NSString *)prop; //gets called when you use myName=self.prop;

および/または

-(void)setProp; //gets called when you use self.prop=@"master";

一方、使用しようとすると、そこにないself._myEntityメソッド名が検索さ_れ、エラーが発生します。

于 2012-12-21T09:01:18.857 に答える
1

コンパイラは追加します

@synthesize myEntity = _myEntity;

@synthesize完全に省略した場合。

ただし、同様に使用できます

@synthesize myEntity;

_myEntity主な違いは、最初のケースでは、getter が myEntity で setMyEntity が setMyEntity であるときに、ローカル変数が呼び出されることです。したがって、外部から yourObject.myEntity にアクセスして、値を設定または取得します。コンパイラは、setter と getter が呼び出されるように処理します。プロパティに直接アクセスしません。 [yourObject.myEntity = value]ist と同一で[yourObject setMyEntity:value]あり、value = yourObject.myEntityと同一ですvalue = [yourObject myEntity]

これまでのところ、外部からプロパティまたはそのゲッターとセッターにアクセスすることはできません。self.myEntity = valueクラス内からは、(2 番目のケースの場合)と同じであると考えるかもしれませんmyEntity = value。そうではありません。self.myEntityセッター (またはゲッター) を呼び出します。これは、ARC の有無にかかわらず、無料で重要なメモリ管理が付属しているため、ゲッターにとって特に重要です。プロパティにmyEntity = value直接アクセスします。

そして、ここに _ とその主な利点があります (imho)。_ 表記を使用すると、プロパティが呼び出され_myValueます。そうすることで、実際のプロパティに直接アクセスするとき、およびゲッターとセッターを使用するときに、コードの読者にとって明確に明確になります。

于 2012-12-21T10:07:08.630 に答える