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」を配置する必要があることがわかりました...それを行いました (うまくいけば正しい)が、ビルドではまだ失敗します。完全なエラー メッセージは次のとおりです: 既存の ivar 'delegate' for property 'delegate' with assign attribute 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ディレクティブは(正しい ARC 修飾子を使用して) ivar を作成するため、その宣言をスキップできます。

@interface ILHuePickerView : ILView 

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

// etc.

実際、これが現在推奨されている手順です。TOCPL でのクラスの定義を参照してください。

于 2012-04-09T21:55:53.667 に答える
2

過去に ILColorPicker を使用したことがありますが、ARC 対応ではありません。ILColorPicker -fno-objC-arcクラスのコンパイラ フラグ設定で設定します。

于 2012-04-09T21:55:30.697 に答える