2017-05-14 5 views
0

私は入力引数を持つデザイナー初期化プログラムを作成します。NSString * 私のクラスでは、プロパティNSString * titleを持っています。initがEXC_BAD_ACCESSを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をログに記録する場合は、エラーが発生します。実行が中断された、理由:EXC_BAD_ACCESS(コード= 2、アドレス= 0x16fcbbff0)。 プロセスは式の評価前の状態に戻りました。 私は割り当て前に初期化しようとしましたが、NSMutableStringを試しました。常に同じこと。私は間違っているの?

+2

クラッシュのバックトレースを表示してください。書かれているように、このコードには何も問題はありません(オブジェクトの初期化と解放の際にgetter/setterを使用しないことをお勧めします)。問題は他のところにあります。 – bbum

答えて

1

割り当ては問題ではありません。問題は他のところです。プロパティの宣言と初期化は推奨パターンに従わないが、表示されているコードにクラッシュすることはありません。

以下は正常に動作します。 を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; 
}