初始化后有 EXC_BAD_ACCESS 到 NSString
After init have EXC_BAD_ACCESS to NSString
我创建了一个带有传入参数 NSString * 的设计器初始化程序
在我的 class 中,我有 属性 NSString* 标题。
@property (nonatomic) NSString *title;
...
- (instancetype)initWithTitle:(NSString*)title albumCover:(UIImage *)img {
self = [super init];
if (self) {
self.title = [[NSString alloc] initWithFormat:@"%@",title];
self.img = img;
}
return self;
}
变量 self.img 一切都很好,但是 self.title 我有问题。如果我想记录 self.title 我得到 error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2, address=0x16fcbbff0)。
进程已经返回到表达式求值前的状态。
我尝试在分配之前进行初始化,并尝试使用 NSMutableString。总是一样的事情。我做错了什么?
作业不是你的问题。问题出在别处。虽然 属性 声明和初始化不遵循推荐的模式,但它们不会导致您显示的代码崩溃。
例如,以下运行良好。您应该将 @property
声明为 copy
并直接分配给实例变量(这样做可以避免任何可能 spring 出现的问题,如果您以后使用业务逻辑实现自定义 setter这需要一个完全初始化的对象)。
@interface Fo:NSObject
@property (nonatomic) NSString *wrongWay;
@property (nonatomic, copy) NSString *rightWay;
@end
@implementation Fo
- (instancetype)initWithTitle:(NSString*)title
{
self = [super init];
if (self) {
self.wrongWay = [[NSString alloc] initWithFormat:@"%@",title];
_rightWay = [title copy];
}
return self;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fo *f = [[Fo alloc] initWithTitle:@"Fo"];
NSLog(@"%@ %@ %@", f, f.wrongWay, f.rightWay);
}
return 0;
}
我创建了一个带有传入参数 NSString * 的设计器初始化程序 在我的 class 中,我有 属性 NSString* 标题。
@property (nonatomic) NSString *title;
...
- (instancetype)initWithTitle:(NSString*)title albumCover:(UIImage *)img {
self = [super init];
if (self) {
self.title = [[NSString alloc] initWithFormat:@"%@",title];
self.img = img;
}
return self;
}
变量 self.img 一切都很好,但是 self.title 我有问题。如果我想记录 self.title 我得到 error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2, address=0x16fcbbff0)。 进程已经返回到表达式求值前的状态。 我尝试在分配之前进行初始化,并尝试使用 NSMutableString。总是一样的事情。我做错了什么?
作业不是你的问题。问题出在别处。虽然 属性 声明和初始化不遵循推荐的模式,但它们不会导致您显示的代码崩溃。
例如,以下运行良好。您应该将 @property
声明为 copy
并直接分配给实例变量(这样做可以避免任何可能 spring 出现的问题,如果您以后使用业务逻辑实现自定义 setter这需要一个完全初始化的对象)。
@interface Fo:NSObject
@property (nonatomic) NSString *wrongWay;
@property (nonatomic, copy) NSString *rightWay;
@end
@implementation Fo
- (instancetype)initWithTitle:(NSString*)title
{
self = [super init];
if (self) {
self.wrongWay = [[NSString alloc] initWithFormat:@"%@",title];
_rightWay = [title copy];
}
return self;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fo *f = [[Fo alloc] initWithTitle:@"Fo"];
NSLog(@"%@ %@ %@", f, f.wrongWay, f.rightWay);
}
return 0;
}