Ошибка ARC при объявлении делегата ivar
Я использую ARC (нет, это не NDA). Я объявляю свой ivar в своем интерфейсе с помощью
id itemDelegate;
Затем объявляю свойство:
@property (nonatomic, weak) id<mySecretDelegateYouAreNotSupposedToSeeOnSO> itemDelegate;
(со слабым вместо назначения из-за ARC)
В моем файле реализации я просто синтезирую его: @synthesize itemDelegate;
Однако я получаю сообщение об ошибке:
"Existing ivar 'ItemDelegate' for _weak property 'itemDelegate' must be _weak".
Кто-нибудь знает, что случилось? Благодарим за помощь.
ARC - автоматический подсчет ссылок
Ответы
Ответ 1
Попробуйте что-то вроде следующего (пример из http://vinceyuan.blogspot.com/2011/06/wwdc2011-session-323-introducing.html):
@interface SomeObject : NSObject {
__weak id <SomeObjectDelegate> delegate;
}
@property (weak) id <SomeObjectDelegate> delegate;
@end
Обратите внимание, как объявляется ivar.
Ответ 2
С ARC и iPhone Simulator 5.0, похоже, работает нормально (никаких предупреждений и т.д.):
SomeObject.h
@class SomeObject;
@protocol SomeObjectDelegate <NSObject>
- (void)someObjectDidFinishDoingSomethingUseful:(SomeObject *)object;
@end
@interface SomeObject : NSObject {
__unsafe_unretained id <SomeObjectDelegate> _delegate;
}
@property (nonatomic, assign) id <SomeObjectDelegate> delegate;
@end
SomeObject.m
#import "SomeObject.h"
@implementation SomeObject
@synthesize delegate = _delegate;
@end
Ответ 3
Существует проблема, когда, даже если вы обновляете XCode (4.2+) из Mac App Store, как требуется Apple, она оставляет старую версию XCode на вашем компьютере. Итак, если у вас есть XCode, прикрепленный к вашей стартовой панели, и запустите его, вы получите все эти ошибки, как указано ниже. Вы должны найти более новую версию XCode, скажем, используя функцию Spotlight, запустить ее, а затем в качестве одной из своих первых задач удалите старую версию XCode. Тогда у вас больше нет сообщений об ошибках.