【问题标题】:'Existing ivar 'delegate' for unsafe_unretained property 'delegate' must be __unsafe_unretainedunsafe_unretained 属性 'delegate' 的现有 ivar 'delegate' 必须是 __unsafe_unretained
【发布时间】:2011-11-15 15:37:52
【问题描述】:

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

.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

错误发生在综合线。不过我找不到问题。

【问题讨论】:

标签: objective-c


【解决方案1】:

使用这个语法:

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

【讨论】:

  • 最初对我有用时我很兴奋,但后来我进一步研究了 __unsafe_unretained 并在 iOS Programming: The Big Nerd Ranch Guide - books.google.com/… 中发现了这一点,基本上说不要这样做。下面来自 Johannes 的注释在带有 ARC 的 iOS 5.1 中非常适合我。
  • @JasonBub 只要您正在为 iOS 5.0 及更高版本构建就可以了。不幸的是,我需要针对 iOS 4.0 及更高版本。
  • @janBP 它对我有用,但你能解释一下为什么必须使用 unsafe_unretained 吗?谢谢
【解决方案2】:

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

#import <UIKit/UIKit.h>

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

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

【讨论】:

  • 该死.. 我正要输入那个(所以我改为 +1 了你的答案)。这是potentially duplicate question
  • 这解决了我的问题,但在另一个类中,我与委托或多或少有相同的代码,并且由于某种原因它不会产生同样的问题。任何想法为什么会这样?我以前没有用 iOS5 编码过,所以这种东西对我来说是新的。
  • 其实我错了,这并不能解决我的问题。它现在只是说关于“弱”属性的相同错误。
  • 如果使用 ARC,那么我们必须删除 "{ id delegate; } " 一切都会正常工作。
【解决方案3】:

当我在我的 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

【讨论】:

  • 它非常适合我从接口定义区域中删除变量
【解决方案4】:

可能有点晚了,但要“符合 ARC”,您只需更换

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

通过

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

再见。

【讨论】:

  • 当我将遗留代码转换为 ark 时,这似乎解决方案非常有效。
【解决方案5】:

如果你想要一个弱属性,这也可以。

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

【讨论】:

    【解决方案6】:

    你也可以使用

    @dynamic delegate 
    

    在执行而不是综合。

    【讨论】:

    • 这只会让代码在运行时崩溃。如果一个人将委托分配给自己,那么您会收到一个无法识别的选择器错误并且程序会停止。
    • 你应该实现你设置委托的所有协议方法或在委托类中分配这些方法可选。
    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多