Почему этот код выдаёт мне ошибку о слабом свойстве? - PullRequest
2 голосов
/ 24 февраля 2012

Это мой простой кусок кода на iOS с использованием ARC:

@interface Person : NSObject {
    NSObject *objStrong;
    NSObject *objWeek;
}
@property(strong) NSObject *objStrong;
//getting error at this line
@property(weak) NSObject *objWeek; //Existing ivar 'objWeek' for _week property 'objWeek' must be _week 

@end

@implementation Person
@synthesize objStrong;
@synthesize objWeek;

@end

Когда я пытаюсь скомпилировать, компилятор жалуется на существующий ivar 'objWeek' для _weak свойства 'objWeek'. Почему этот код не компилируется правильно?

Ответы [ 2 ]

10 голосов
/ 24 февраля 2012

Жалуется, потому что вспомогательная переменная NSObject *objWeek объявлена ​​как __strong (все остальные аннотированные указатели Objective C на сохраняемые объекты - __strong).Измените вспомогательную переменную на __weak NSObject *objWeek, и вам снова понравится компилятор.

Редактировать: По запросу, документация ARC из ллана LLVM:

4.4.1.Объекты

Если объект объявлен с сохраняемым типом владельца объекта, но без явного квалификатора владения, его тип неявно корректируется, чтобы иметь __strong квалификацию.

В качестве особого случая, если база объектатип - это класс (возможно, квалифицированный по протоколу), вместо этого тип имеет квалификацию __unsafe_unretained.

Ссылка: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference

1 голос
/ 23 января 2014

Та же проблема, с которой я столкнулся.Я потратил много времени на это, наконец, я мог решить эту проблему, очистив проект. Вот путь ....

product-> clean

Причина в том, что вы можете быть удаленыкласс контроллера (ViewController), но он все еще не удален из вашего проекта. Когда вы закончите очистку вашего проекта, ошибка исчезнет автоматически.Это сработало для меня ...

...