Почему я не могу выделить / init - получить предупреждение «Назначение сохраненного объекта небезопасному свойству»? - PullRequest
7 голосов
/ 25 ноября 2011

Я новичок в ARC, и у меня есть объект, который имеет несколько внутренних классов в качестве членов. В методе init я хочу выделить для них новые объекты.

ClassA.h

#import "ClassB.h"
@interface ClassA : NSObject
@property (assign) ClassB *member;
@end

ClassB.h

@interface ClassB : NSObject
@property (assign) NSString *name;
@end

ClassA.m

@synthesize member = _member;
-(id)init
{
    _member = [[ClassB alloc] init];
}

Но я получаю ошибки "Присвоение сохраненного объекта небезопасному свойству". Я искал через Интернет и не вижу другой информации по этому конкретному предупреждению. Он компилируется, но получает исключение плохого доступа во время выполнения.

1 Ответ

12 голосов
/ 25 ноября 2011

Непосредственная проблема состоит в том, что вы назначаете объект члену, помеченному weak, что означает, что объект не будет иметь сильную ссылку и будет немедленно освобожден. Использование strong или retain вместо weak или assign исправит это.

Большая проблема с вашим -init методом заключается в том, что он не вызывает [super init] и ничего не возвращает. Как минимум, ваш -init должен выглядеть так:

-(id)init
{
    self = [super init];
    if (self != nil) {
        self.member = [[ClassB alloc] init];
    }
    return self;
}
...