原文地址:http://flandycheng.blog.51cto.com/855176/556179/
Objective-C语言关键词,与@synthesize配对使用。
功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。 如: 1、在头文件中: @property int count; 等效于在头文件中声明2个方法: - (int)count; -(void)setCount:(int)newCount; 2、实现文件(.m)中 @synthesize count; 等效于在实现文件(.m)中实现2个方法。 - (int)count { return count; } -(void)setCount:(int)newCount { count = newCount; } 以上等效的函数部分由编译器自动帮开发者填充完成,简化了编码输入工作量。
这样讲操作封装起来,自然有好处了,再看一篇:
原文地址:http://moto0421.iteye.com/blog/1577459
Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar
在 64-bit时,运行时系统会自动给类添加 ivar,添加的 ivar 以一个下划线"_"做前缀。
上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操作的就是_window这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。
下面是一个常见的例子
写法一:
- @interface MyClass:NSObject{
- MyObjecct *_myObject;
- }
- @property(nonamtic, retain) MyObjecct *myObject;
- @end
- @implementatin MyClass
- @synthesize myObject=_myObject;
- @interface MyClass:NSObject{
- }
- @property(nonamtic, retain) MyObjecct *myObject;
- @end
- @implementatin MyClass
- @synthesize myObject=_myObject;
- self.nameVarPtr = [[ObjectName alloc] init]
- nameVarPtr = [[ObjectName alloc] init]
self.nameVarPtr=xxx 这种赋值方式等价于调用 [self setnameVarPtr:xxx], 而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。
nameVarPtr = xxx 的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。
综上,对成员变量进行赋值,为防内存泄露需要注意的点:
1.self调用setter方法的方式
ObjectName* tmp= [[ObjectName alloc] init];
self.nameVarPtr =tmp; //retainCount=2
[tmp release]; //retainCount=1
2.指针赋值方式,不会调用setter方法
nameVarPtr= [[ObjectName alloc] init]; // retainCount=1
所以,笔者建议大家在对某个变量进行赋值操作的时候,尽量要写self.myObj = xxx; 这才是最可靠的方法。