我有一个简单的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
如果我使用initWithText:
方法在视图控制器中创建一个Answers数组,当我在数组中取一个Answer并尝试找到它的文本值时,我不可避免地会出现EXC_BAD_ACCESS错误。
但是,如果我初始化一个新的答案,请设置文本值,然后将其添加到我没有此访问权限的数组中。
所以这会导致问题:
[arrayOfAnswers addObject:[[Answer alloc] initWithText:@"Hello"]];
但这不是:
Answer *newAnswer = [[Answer alloc] initWithText:nil];
newAnswer.text = @"Hello";
[arrayOfAnswers addObject:newAnswer];
任何人都可以解释原因吗?
答案 0 :(得分:5)
您直接使用属性 _text 和 _votes ,但不是他们的二传手。 因此,您不会为行
保留输入参数 answer_text = answer;
您应该更改为
_text = [answer retain];
或
self.text = answer;
答案 1 :(得分:1)
您是否保留了将Answers
放入的阵列?这就是我对错误的猜测。
答案 2 :(得分:0)
如你所见,你的
@property(nonatomic,retain)NSString * text; //这个属性是保留的。
所以这个setter方法应该是- (void) setText:(NSString*)text{
[_text release];
_text = text;
[_text retain];
因此,当您调用newAnswer.text = @“hello”时,它可以正常工作,newAnswer会保存文本。
但是在你的initWithText中,没有保留符号,所以很糟糕。