14

我有一个来自 .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”......我这样做了(希望是正确的),但它仍然在构建中失败。完整的错误信息是:Existing ivar 'delegate' for property 'delegate' with assign 属性 must be __unsafe_unretained

截屏

我究竟做错了什么?

4

2 回答 2

34

正如错误消息告诉您的那样,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 中定义类。

于 2012-04-09T21:55:53.667 回答
2

我过去使用过 ILColorPicker,但它绝对不是 ARC 就绪的。-fno-objC-arc在 ILColorPicker 类的编译器标志设置中设置。

于 2012-04-09T21:55:30.697 回答