2

私はこのプロパティを持っています:

@property (nonatomic, getter = getSolutionsCount, setter = setSolutionsCount:) NSInteger solutionsCount;

と実装

- (NSInteger)getSolutionsCount {
    return self.solutionsCount;
}

このメソッドで EXC_BAD_ACCESS を取得します- (NSInteger)getSolutionsCount

ここで何が間違っていますか?

4

4 に答える 4

3

self.solutionsCountは に変換され[self getSolutionCount]ます。再帰呼び出しを行っています。

合成された ivar を単に返したい場合は、このメソッドを実装しないでください。しかし、そうする場合は、単に を呼び出しますreturn _solutionCount;

于 2012-11-05T00:06:58.523 に答える
3

ドット構文は、基本的にゲッターを呼び出すためのショートカットです。getter メソッドに無限再帰があります。

あなたがする必要があるのは、インスタンス変数を直接返すことです:

- (NSInteger)getSolutionsCount {
    //latest xcode makes variables with _property name automatically
    return _solutionsCount;

    //older versions of xcode or having written @synthesize solutionsCount
    //will necessitate
    //return solutionsCount;
}

また、FYI Objective-C の慣例は、getter メソッドを変数名として定義することです。プロパティ宣言にgetterを書かないと、プロパティ名と同じgetterが想定される

編集: また、コンパイラに自動的に作成させる場合、何も書く必要がないため、これがゲッターの実装全体ではないと想定しています。(または、@synthesize propertyName = _propertyName古いバージョンの xCode を使用して実装ブロックに書き込むことによって)

于 2012-11-05T00:08:03.710 に答える
2

ここにはいくつかの問題があります。

  1. 命名規則によれば、getter は get で始めるべきではありません。値を読み取るには、 を使用する必要がありますself.solutionsCount。したがって、プロパティ宣言で getter メソッドの名前を指定する必要はありません。

  2. 自動的に生成されるため、setter の名前を指定する必要はありません。

プロパティは次のようになります。

@property (nonatomic, assign) NSInteger solutionsCount;
  1. カスタムの getter 実装を作成して機能させる必要はありません。コンパイラにメソッドを合成するように依頼します。

    @synthesize ソリューション数;

インスタンス変数に直接アクセスしたい場合は、コンパイラに合成を依頼してください。

@synthesize solutionsCount = _solutionsCount;
  1. object-c と命名規則のドキュメントを最初に読んでください。彼らは非常に役立ちます。

幸運を!

于 2012-11-05T00:14:32.040 に答える
2

問題はself.solutionsCountと同じ[self getSolutionsCount]であるため、ゲッターは直接再帰的です。おそらく、基礎となる ivar に直接アクセスしたいと思うでしょう。そのためには を使用しますself->_solutionsCount。または、 を明示的に使用したくない場合はself、単に_solutionsCount.

于 2012-11-05T00:07:19.100 に答える