Objective c 为什么我会出错;无法使用“手动引用计数”在文件中合成弱属性;定义委托时?

Objective c 为什么我会出错;无法使用“手动引用计数”在文件中合成弱属性;定义委托时?,objective-c,class,delegates,Objective C,Class,Delegates,我在一个文件中有协议和类头: @protocol SomethingDelegate - (void) doSomething; @end @interface SomethingClass @property (nonatomic, weak) id <SomethingDelegate> delegate; @end 如果我把它改成这样: @implementation SomethingClass @synthesize delegate; // in here I g

我在一个文件中有协议和类头:

@protocol SomethingDelegate
- (void) doSomething;
@end

@interface SomethingClass
@property (nonatomic, weak) id <SomethingDelegate> delegate;
@end
如果我把它改成这样:

@implementation SomethingClass 

@synthesize delegate; // in here I got error "Cannot synthesize weak property in file using manual reference counting"

@end

为什么会这样?如何解决这个问题?如果我从
更改为
,错误将消失。但这不是应该声明委托的方式,对吗?如何正确声明弱委托?

您需要在项目的
构建设置
下的
Apple LLVM 8.0-语言-Objective C
中将手动保留版本中的
弱引用设置为
,如屏幕截图所示-


您不必使用合成,因为Xcode 4.4和LLVM 2.0编译器会自动进行合成。 您可以删除该行

 @synthesize delegate; 
如果要手动进行合成,可以在生成设置中将“隐式合成属性”标志设置为“是”,从而启用该标志


您使用的是手动保留版本。您不能在属性中使用弱/强。您应该使用保留/分配。

实际上,当编译器自动合成它时,它会产生与您在我的第二个代码块上看到的相同的错误。并将您的属性从弱更改为分配。谢谢。所以我想我不能用弱的。我是在一个遗留项目的基础上构建的,所以我想这就是手动保留版本的原因。据我所知,构建设置中的“隐式合成属性”标志只是一个编译器警告标志,所以实际上它不会改变任何东西。为了能够在nonARC中合成弱属性,构建设置中的“Manual Retain Release中的弱引用”标志应设置为“是”。谢谢您的回答,但我正在使用遗留项目设置进行开发,我担心更改任何可能破坏代码的设置。我相信Xcode中的新项目已经将此选项设置为“是”
,对吗?@ChenLiYong well legacy project。。。。。我可以理解,在新创建的使用Xcode 8的项目中,这个选项默认为否,我们需要将它设置为是。
 @synthesize delegate;