Подтвердить что ты не робот

__unsafe_unretained для делегата не будет строить

У меня есть этот код (фрагмент) из файла .h:

#import <UIKit/UIKit.h>
#import "ILView.h"

/**
 * Controls the orientation of the picker
 */
typedef enum {
    ILHuePickerViewOrientationHorizontal     =   0,
    ILHuePickerViewOrientationVertical       =   1
} ILHuePickerViewOrientation;

@class ILHuePickerView;

/**
 * Hue picker delegate
 */
@protocol ILHuePickerViewDelegate

/**
 * Called when the user picks a new hue
 *
 * @param hue 0..1 The hue the user picked
 * @param picker The picker used
 */
-(void)huePicked:(float)hue picker:(ILHuePickerView *)picker;

@end

/**
 * Displays a gradient allowing the user to select a hue
 */
@interface ILHuePickerView : ILView {
    id<ILHuePickerViewDelegate> delegate;
    float hue;
    ILHuePickerViewOrientation pickerOrientation;
}

/**
 * Delegate
 */
//@property (assign, nonatomic) IBOutlet id<ILHuePickerViewDelegate> delegate;
@property (assign, nonatomic) IBOutlet __unsafe_unretained id<ILHuePickerViewDelegate> delegate;

/**
 * The current hue
 */
@property (assign, nonatomic) float hue;

Файл .m выглядит следующим образом:

#import "ILHuePickerView.h"
#import "UIColor+GetHSB.h"

@interface ILHuePickerView(Private)

-(void)handleTouches:(NSSet *)touches withEvent:(UIEvent *)event;

@end

@implementation ILHuePickerView

@synthesize color, delegate, hue, pickerOrientation;

#pragma mark - Setup

-(void)setup
{
    [super setup];

Я смотрел на SO для подобных случаев и увидел, что мне нужно положить "__unsafe_unretained" в свойство... Я сделал это (надеюсь, правильно), но он все равно не работает в сборке. Полное сообщение об ошибке: Существующий ivar 'delegate' для свойства 'delegate' с атрибутом assign должен быть __unsafe_unretained

Screenshot

Что я делаю неправильно?

4b9b3361

Ответ 1

Как сообщается вам сообщение об ошибке, ivar:

@interface ILHuePickerView : ILView {
    id<ILHuePickerViewDelegate> delegate;    // <-- This is the ivar

необходимо объявить __unsafe_unretained:

__unsafe_unretained id<ILHuePickerViewDelegate> delegate;

не свойство:

@property (assign, nonatomic) IBOutlet id<ILHuePickerViewDelegate> delegate;

поскольку квалификаторы собственности ARC не относятся к свойствам; они применимы только к переменным.

Так как директива @synthesize создает для вас ivar (с правильным классификатором ARC), вы можете просто пропустить свое объявление:

@interface ILHuePickerView : ILView 

/**
 * Delegate
 */
@property (assign, nonatomic) IBOutlet id<ILHuePickerViewDelegate> delegate;

// etc.

Это, по сути, теперь рекомендуемая процедура; см. Определение классов в TOCPL.

Ответ 2

Я использовал ILColorPicker в прошлом, и он определенно не готов к ARC. Задавать -fno-objC-arc в настройках флага компилятора для классов ILColorPicker.