Joh*_*n H 4 xcode exc-bad-access objective-c
我有一个简单的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
Run Code Online (Sandbox Code Playgroud)
实现如下:
#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
Run Code Online (Sandbox Code Playgroud)
如果我使用该initWithText:方法在视图控制器中创建一个Answers数组,当我在数组中取一个Answer并尝试找到它的文本值时,我不可避免地会出现EXC_BAD_ACCESS错误.
但是,如果我初始化一个新的答案,设置文本值,然后将其添加到数组我没有此访问问题.
所以这会导致问题:
[arrayOfAnswers addObject:[[Answer alloc] initWithText:@"Hello"]];
Run Code Online (Sandbox Code Playgroud)
但这不是:
Answer *newAnswer = [[Answer alloc] initWithText:nil];
newAnswer.text = @"Hello";
[arrayOfAnswers addObject:newAnswer];
Run Code Online (Sandbox Code Playgroud)
有谁能解释为什么?
小智 5
你直接使用属性_text和_votes但不是他们的setter.所以,你不持有输入参数答案为线
_text = answer;
Run Code Online (Sandbox Code Playgroud)
你应该改为
_text = [answer retain];
Run Code Online (Sandbox Code Playgroud)
要么
self.text = answer;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |