@synthesize是做什么的?

我看过以下代码:

//example.h MKMapView * mapView1; @property (nonatomic, retain) MKMapView * mapView; //example.m @synthesize mapView = mapView1 

问题: mapViewmapView1有什么关系? 它是否为mapView1创buildsetget方法?

谢谢 !

在你的例子中, mapView1是一个实例variables (ivar),这是一个属于example.hexample.m定义的类的实例的内存存储器。 mapView是一个属性的名称。 属性是可以使用点符号来读取或设置的对象的属性: myObject.mapView 。 一个财产不一定要基于一个伊娃,但大多数属性是。 @property声明只是告诉世界有一个叫做mapView的属性。

@synthesize mapView = mapView1;

这一行告诉编译器为mapView创build一个setter和getter,并且他们应该使用叫做mapView1的ivar。 如果没有= mapView1部分,编译器会认为属性和ivar具有相同的名称。 (在这种情况下,这会产生编译器错误,因为没有叫做mapView ivar。)

这个@synthesize语句的结果类似于你自己添加了这个代码:

 -(MKMapView *)mapView { return mapView1; } -(void)setMapView:(MKMapView *)newMapView { if (newMapView != mapView1) { [mapView1 release]; mapView1 = [newMapView retain]; } } 

如果您自己将该代码添加到类中,则可以使用replace@synthesize语句

@dynamic mapView;

主要的是要在ivars和属性之间有一个非常明确的概念区分。 他们实际上是两个非常不同的概念。

@synthesize为variables创build一个getter和setter。

这可以让你为你的variables指定一些属性,当你把这个属性合成到variables时,你为variables生成getter和setter。

属性名称可以与variables名称相同。 有时人们希望它不同,以便在initdealloc使用它,或者当参数以相同variables的名称传递时使用它。

从文档 :

如果不在@implementation块中提供它们,则使用@synthesize关键字来告诉编译器它应该为属性合成setter和/或getter方法。

正如我在编辑遗留代码时遇到这个问题一样,我想对现有的答案做一些额外的注释,需要注意。

即使使用较新的编译器版本,如果省略@synthesize propertyName它有时也会有所作为

在这种情况下,如果声明一个没有下划线的实例variables,仍然可以合成它,例如:

标题:

 @interface SomeClass : NSObject { int someInt; } @property int someInt; @end 

执行:

 @implementation SomeClass @synthesize someInt; @end 

self.someInt将访问与someInt相同的variables。 对于ivars,不使用前导下划线不遵循命名约定,但是我刚进入一个需要阅读和修改这样的代码的情况。

但如果你现在想“嘿,@synthesize不再重要,因为我们使用一个新的编译器”你错了! 然后你的类将导致有两个ivars ,即someInt加上一个自动生成的_someIntvariables。 因此self.someIntsomeInt不会再处理相同的variables。 如果你不期望像我这样的行为,这可能会让你头痛发现。

根据苹果文档@Synthesize仅用于重命名实例variables。 例如

 @property NSString *str; @synthesize str = str2; 

现在在这个类中你不能使用_str因为上面的行已经将实例variables重命名为str2

@property允许对象被其他类中的对象使用,或者换句话说就是公开对象。

查看苹果文档

基本上综合创build一个setMapView和mapView方法设置和获取mapView1

它为你的对象创buildgetter和setter。 你可以访问这样的东西:

 MKMapView* m = object.mapView; 

要么

 object.mapView = someMapViewObject 

mapView1是类中的ivar的名称,mapView是getter / setter方法的名称。