4

次のような単純なAnswerクラスがあります。

@interface Answer : NSObject {
  NSString *_text;
  NSNumber *_votes;
}

@property(nonatomic, retain) NSString *text;
@property(nonatomic, retain) NSNumber *votes;

+(id)initFromAnswerData:(NSSet *)data;
-(id)initWithText:(NSString *)answer;

@end

実装は次のようになります。

#import "Answer.h"
#import "AnswerData.h"
#import "AppDelegate.h"

@implementation Answer

@synthesize text = _text;
@synthesize votes = _votes;


-(id)initWithText:(NSString *)answer {
  if( (self=[super init])) {
    _text = answer;
    _votes = 0;
  }
  return self;
}


@end

メソッドを使用してViewControllerで回答の配列を作成すると、配列initWithText:内の回答を取得してそのテキスト値を見つけようとすると、必然的にEXC_BAD_ACCESSエラーが発生します。

ただし、新しい回答を初期化する場合は、テキスト値を設定してから配列に追加すると、このアクセスの問題は発生しません。

したがって、これにより問題が発生します。

[arrayOfAnswers addObject:[[Answer alloc] initWithText:@"Hello"]];

しかし、これはしません:

Answer *newAnswer = [[Answer alloc] initWithText:nil];
newAnswer.text = @"Hello";
[arrayOfAnswers addObject:newAnswer];

誰かが理由を説明できますか?

4

3 に答える 3

5

属性_text_votesを直接使用していますが、それらのセッターは使用していません。したがって、その行の入力パラメータの回答を保持していません

_text = answer;

次のいずれかに変更する必要があります

_text = [answer retain];

また

self.text = answer;
于 2012-08-17T15:37:54.240 に答える
1

配置したアレイを保持していますAnswersか?それが何が悪いのかという私の推測です。

于 2012-08-17T15:33:09.523 に答える
0

ご覧のとおり、@ property(nonatomic、retain)NSString * text; //このプロパティは保持されます。したがって、このセッターメソッドは、- (void) setText:(NSString*)text{ [_text release]; _text = text; [_text retain]; newAnswer.text = @ "hello"を呼び出すと機能し、newAnswerがテキストを保持するようにする必要があります。ただし、initWithTextには保持記号がないため、問題が発生します。

于 2012-08-22T07:59:17.060 に答える