次のような単純な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];
誰かが理由を説明できますか?