初始化后有 EXC_BAD_ACCESS 到 NSString

Posted

技术标签:

【中文标题】初始化后有 EXC_BAD_ACCESS 到 NSString【英文标题】:After init have EXC_BAD_ACCESS to NSString 【发布时间】:2017-05-14 17:33:42 【问题描述】:

我创建了一个带有传入参数 NSString * 的设计器初始化程序 在我的课堂上,我有属性 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。总是一样的。我做错了什么?

【问题讨论】:

请显示崩溃的回溯。正如所写的那样,该代码没有任何问题(尽管避免在对象的初始化和释放中使用 getter/setter 是个好主意)。问题出在其他地方。 【参考方案1】:

任务不是你的问题。问题在别处。虽然属性声明和初始化不遵循推荐的模式,但它们不会导致您显示的代码崩溃。

例如,以下运行良好。您应该将您的 @property 声明为 copy 并直接分配给实例变量(这样做可以避免您以后使用需要完全初始化对象的业务逻辑实现自定义设置器时可能出现的任何问题)。

@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;

【讨论】:

以上是关于初始化后有 EXC_BAD_ACCESS 到 NSString的主要内容,如果未能解决你的问题,请参考以下文章

Nativescript throwing Thread 1: EXC_BAD_ACCESS (code=1, address=0x1edf38) 仅在 Xcode

更改 nsdictionary 中的布尔值时的 EXC_BAD_ACCESS

libtorrent::session 初始化期间的 EXC_BAD_ACCESS 错误

尝试在 Swift 中初始化 UIActionSheet 时出现 EXC_BAD_ACCESS

为啥在视图控制器被取消初始化并导致 SIGABRT 或 EXC_BAD_ACCESS 后观察者仍然活着?

聊天应用,分配问题。 Xcode 中的自定义类初始化错误(EXC_BAD_ACCESS 代码=2)