@synthesize是做什么的?
我看过以下代码:
//example.h MKMapView * mapView1; @property (nonatomic, retain) MKMapView * mapView; //example.m @synthesize mapView = mapView1 问题: mapView和mapView1有什么关系? 它是否为mapView1创buildset和get方法?
谢谢 !
 在你的例子中, mapView1是一个实例variables (ivar),这是一个属于example.h和example.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名称相同。 有时人们希望它不同,以便在init或dealloc使用它,或者当参数以相同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.someInt和someInt不会再处理相同的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方法的名称。