一. 下划线_
众所周知现在_属性用来访问属性,而不是调用get方法,可是在以前并不是这样。
所以之前访问属性没有下划线,而且还必须要有与之对应的成员变量。然后就有一个有意思的现象,所以为了能够兼容之前老的xcode,
有很多框架都是这样写的。
另外说一下 _属性和成员变量(本身就有下划线),这样做的目的是让其与局部变量区分,声明属性之后,xcode会自己生成一个带下划线成员变量。
二.property synthesize关键字
还是有历史原因,之前的propery只是对声明的属性做set get方法的声明,并没有实现,这个时候synthesize关键字跟property是配套出现的,synthesize是对相应的属性进行set get方法的实现。然而也不知道从什么时候起,property(...),括号里默认是有readwrite这个关键字的。也就是说property声明属性时,编译器会自动根据readonly readwrite(默认)生成set get方法。synthesize这个作用是废了,但是还有其他作用啊。
@synthesize name; 这样写表示在.m文件访问这个属性时,只能用name,和self.name(个人觉得没用)。
因为在Xcode4.5及以后的版本中,可以省略@synthesize ,编译器会自动帮你加上getter 和 setter 方法的实现,并且默认会去访问
_name这个成员变量,如果找不到_name这个成员变量,会自动生成一个叫做 _name的私有成员变量。
也就是说编辑器很聪明,最后他会帮我们生成一对一配套的成员变量和属性。并且会有相应的set get方法。
@synthesize name = _name;这个还是有一点用,如果你的成员变量和属性名有一个相同的话,如上述(下划线_)情况,那么就可以把成员变量和属性名合并,用_name和self.name访问。
三. IOS 成员变量,全局变量,局部变量定义,static与extern的区别1,先说定义
#import "S1ViewController.h"
@interface S1ViewController ()
//这里做声明
@end
@implementation S1ViewController
@end
@interface S1ViewController : UIViewController
{
NSString* sttr2; // S1ViewController实体对象的成员变量
}
@property(nonatomic,retain) NSString* sttr2; //定义点语法的快捷操作setter 与 getter方法
@end
注明:在h文件中定义的变量,在外部可见
.h声明了类,相当于java的接口,在这里interface块外声明的函数和属性都是外部可见的,但是在块内的貌似是私有的
.m里面的所有东西都是对外封闭的 这样就是有效的源码的开源与闭源;
//规范的
static int hu=3;//全局变量
NSString*sttr1=@"S1ViewController";//全局变量
@implementation S1ViewController
@end
//不规范的
@implementation S1ViewController
static int hu=3;//全局变量
NSString*sttr1=@"S1ViewController";//全局变量
总结:以后写代码,只需要用property就够了,他会自动补上成员变量和set get方法,简单多了吧。