Objective c 属性只能用@synthesis声明而不能用@property声明吗?

Objective c 属性只能用@synthesis声明而不能用@property声明吗?,objective-c,Objective C,我在我的项目中发现了以下代码(使用ARC)。看起来没有声明属性adDisplay。只有一个合成语句,编译器不会抱怨它 @interface MyClass() <MyProtocol> { AdDisplay * _adDisplay; } @end @implementation @synthesize adDisplay = _adDisplay; ... @end 如果我想确保adDisplay被强烈保留 谢谢 更新:它确实在协议中声明。这算是实例变量吗?O

我在我的项目中发现了以下代码(使用ARC)。看起来没有声明属性
adDisplay
。只有一个合成语句,编译器不会抱怨它

@interface MyClass() <MyProtocol> {
    AdDisplay * _adDisplay;
}
@end

@implementation

@synthesize adDisplay = _adDisplay;


...

@end
如果我想确保
adDisplay
被强烈保留

谢谢


更新:它确实在协议中声明。这算是实例变量吗?

Objective-C中的属性是一对方法的名称:setter和getter。声明属性意味着说明这两个方法存在(对于读写属性)

不必有任何真正的存储或内存管理。过去,在手动内存管理下,
assign
retain
copy
会影响方法的合成方式

然而,在ARC下,这不再需要。当您将属性声明为
strong
时,它不会影响方法体,只会影响ivar的类型

因为您已经手动声明了ivar

AdDisplay * _adDisplay;
(如
strong

那么
@属性
声明中的
strong
将不会产生任何实际效果,只能作为API使用者的文档

以下工作也将起作用:

@interface MyClass() <MyProtocol>
@end

@implementation

@synthesize adDisplay;

@end
@接口MyClass()
@结束
@实施
@综合叠加显示;
@结束

还要注意,在将项目从MRC迁移到ARC时,这曾经是一个常见的内存泄漏问题。声明为
、ivar声明为

的属性是否确定该属性未在
MyProtocol
或标头内声明?我认为这没有多大意义,否则的话。是的,协议中已经声明了。但在内存管理方面,这是如何工作的呢?是否将其视为实例变量?
@interface MyClass() <MyProtocol>
@end

@implementation

@synthesize adDisplay;

@end