oc 零散知识 下划线 property synthesize

一. 下划线_

       众所周知现在_属性用来访问属性,而不是调用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,先说定义

  1)成员变量定义:生存与该类的生命周期, 变量存活周期跟你定义的该类实体对象一样;作用域是整个实体对象;可以在h文件中声明或者在m文件中@implementation上面添加的

#import "S1ViewController.h"

@interface S1ViewController ()

//这里做声明

@end

@implementation S1ViewController

@end

举例:S1ViewController.h文件中定义

@interface S1ViewController : UIViewController

{

    NSString* sttr2;    //  S1ViewController实体对象的成员变量

}

@property(nonatomic,retain) NSString* sttr2;  //定义点语法的快捷操作setter 与 getter方法

@end

注明:在h文件中定义的变量,在外部可见

.h声明了类,相当于java的接口,在这里interface块外声明的函数和属性都是外部可见的,但是在块内的貌似是私有的

.m里面的所有东西都是对外封闭的   这样就是有效的源码的开源与闭源;

 2)全局变量
  定义:在@implementation外定义的变量(在 @implementation中定义也是可以但是一般不这么干
举例:

//规范的

 

static int hu=3;//全局变量

NSString*sttr1=@"S1ViewController";//全局变量

@implementation S1ViewController

@end 

//不规范的

@implementation S1ViewController

static int hu=3;//全局变量

NSString*sttr1=@"S1ViewController";//全局变量

@end 

  全局变量分为两种:
1) static  修饰的  也称私有全局变量,只在该源文件中可用
    学习过Java 或者 C 语言的朋友应该很清楚static关键字吧?在某个类中声明一个static 静态变量, 其他类中想使用它或者修改它不用new 这个对象 ,直接使用它的类名方可直接拿到这个静态变量的对象,遍可以在其他类中任意修改这个变量的数值。它是存于全局变量区, 生命周期和程序相同,static只在声明的类中可见。
在声明的类中结束后,再次使用还是之前的值。
在Objective-C 的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中 。不过可以调用这个类的方法间接的修改这个静态变量的值
static关键字声明的变量须放在implementation外面,或者方法中,如果不为它赋值默认为0,它只在程序开机初始化一次(并不是该类实例化后才初始化的)
将static静态变量写在方法中,它的初始化也是在程序开机时,程序一旦启动以后static是不能在创建的。所以程序在这里调用了5次这个方法,sCount的值并没有因为重新创建static sCount而改变,而是将sCount的值一直存在内存中。
2)没有 static  修饰的 ,在任何源文件中都可以用,注意:定义没有static的全局变量,命名一定要很独特,才能区分与其他源文件中的全局变量,如果出现跟其他源文件同名的全局变量,则会报错误
IOS <wbr>成员变量,全局变量,局部变量定义,static与extern的区别
例如:
NSString*sttr1=@"S1ViewController";//全局变量  

在其他文件如果要用该全局变量,在前面加extern  NSString *sttr1;即可使用了

总结:以后写代码,只需要用property就够了,他会自动补上成员变量和set get方法,简单多了吧。

你可能感兴趣的:(oc 零散知识 下划线 property synthesize)