@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
加上一个自动生成的_someInt
variables。 因此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方法的名称。