'unsafe_unretained属性'委托'的现有ivar'委托'必须__unsafe_unretained

时间:2011-11-15 15:37:52

标签: objective-c

我收到上述错误,但不确定如何修复它。这是我的代码:

·H:

#import <UIKit/UIKit.h>

@protocol ColorLineDelegate <NSObject>

-(void)valueWasChangedToHue:(float)hue;

@end

@interface ColorLine : UIButton {

    id <ColorLineDelegate> delegate;

}

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

@end

的.m:

#import "ColorLine.h"

@implementation ColorLine

@synthesize delegate;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

@end

合成行中发生错误。我找不到问题。

6 个答案:

答案 0 :(得分:53)

使用以下语法:

@interface SomeClass  : NSObject {
    id <SomeClassDelegate> __unsafe_unretained  delegate;
}
@property (unsafe_unretained) id <SomeClassDelegate> delegate;

答案 1 :(得分:50)

看起来您的项目可能正在使用ARC,那么属性应该以这种方式声明:

#import <UIKit/UIKit.h>

@protocol ColorLineDelegate <NSObject>
-(void)valueWasChangedToHue:(float)hue;
@end

@interface ColorLine : UIButton 
@property (nonatomic, weak) id <ColorLineDelegate> delegate;
@end

答案 2 :(得分:20)

当我在ARC项目中使用没有ARC功能的旧示例代码时,我遇到了同样的问题。您似乎不再需要将变量声明放入接口定义中。所以你的代码应该像这样工作:

H:

#import <UIKit/UIKit.h>

@protocol ColorLineDelegate <NSObject>

-(void)valueWasChangedToHue:(float)hue;

@end

@interface ColorLine : UIButton {

    // Get rid of this guy!
    //id <ColorLineDelegate> delegate;
}

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

@end

的.m:

#import "ColorLine.h"

@implementation ColorLine

@synthesize delegate;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

@end

答案 3 :(得分:6)

也许有点晚,但要“符合ARC”,你只需要替换

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

通过

@property (nonatomic, strong) id <ColorLineDelegate> delegate;

再见。

答案 4 :(得分:3)

如果你想要一个弱的属性,这也有效。

@interface MyClass  : NSObject {
    __weak id <MyClassDelegate> _delegate;
}
@property (nonatomic, weak) id <MyClassDelegate> delegate;

答案 5 :(得分:1)

您也可以使用

@dynamic delegate 

在实现中而不是合成。