一 属性的声明:
@property NSString * name;
@snythesize name;
与下列两个方法是等价的
-(void)setName:(NSString*)nam;
-(NSString *)name;
-(void)setName:(NSString *)nam
{
name = nam;
}
-(NSString *)name
{
return name;
}
上边的两种方法,很明显的可以看出第一种方法的优点是不必要写那么多的代码,因为这两个语句就是告诉编译器,要编译器自动生成setter和getter方法
下边介绍@property和@snythezise的使用方法
@property(参数)
参数主要分为三种
1 读取类型:(readwrite和readonly)
readonly:只能生成getter方法,不能生成setter方法,所以不可以和copy、retain和assign方法一起使用
Readwrite既能生成getter方法也可以生成setter方法
2 setter语意:(retain、assign、copy)
retain:释放掉旧的对象,然后把旧对象的值赋给新输入的对象,再把新对象的索引值提高到1
Assign简单赋值,不给计数器值加1
Copy建立一个计数器值为1的对象,释放掉新的对象
3 原子性atomicity(nonatomic)
Atomic的意思是setter/getter这个函数是一个原语操作,如果有多个线程同时调用setter方法的话,不会出现在一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相当于函数的头尾加了锁一样。
Nonatomic不保证原语操作,所以可能会娶不到完整的东西。
所以,如果不需要多线程支持的时候,nonatomic就可以了,另外由于不涉及锁的操作,所以速度更快
atomic的意思就是setter/getter这个函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样。
@snythezise name;
生成相应的getter方法
例如
@property(nonatomitic,copy) Class * aclass;
@snythezise aclass;
等同于
-(void)setAClass : (Class)_aClass
{
If(aClass != _aClass)
{
[aClass release] ;
aClass = [_aClass copy];
}
}
-(Class *)aClass
{
Return Aclass;
}
二 协议
协议是一组公开的方法声明,谁实现协议,就要实现协议中的方法声明。协议的关键字是protocol,以@protocol开始以@end结束,在某个类中要应用协议时,只要在类的后边<协议名>就可以,协议方法的实现,只要在类的实现中,实现就好。协议还可以扩展已有的协议。协议的方法中有@optional和@required两种,前者的方法可以实现也可以不实现,但是后者的方法一定要实现,协议中默认的方法都是@requied的
三 非正式协议
在已经定义好了的类中,想要添加新的方法,可以不必修改类,利用类别可以实现。类别category,在类名的后边加上(类别名),如果类别中的方法,在类中已经有声明实现,类别中的方法将把原来的方法覆盖掉,类别的一个缺点是,只可以添加方法,不可以添加属性。利用这一缺点,我们可以把类中的某些方法,不再类中实现,而在类别中实现,可以使类的方法在多个.m文件中实现,简化了文件的管理。类别还有一种方法就是非正式协议,非正式协议继承于NSObject类,大多数类都继承于这个类,所以可以在任何类中使用类别。
四 静态变量
静态变量的关键字是static。静态变量的存储形式是静态的,相当于全局变量。
1 变量特点
静态局部变量
静态局部变量就是在函数内部定义的变量,生命周期是整个源程序,但是作用函数是函数体内部,即当退出函数,变量仍存在,只是不可以再用了,静态局部可以手动赋初值,但是如果不赋值的话,系统会自动给变量赋值为0,但是自动变量不赋值,他的值是不固定的。虽然离开函数后他的值不可以再被使用,但是当再次调用函数的时候,又可以继续使用,并且保留了前一次函数调用后的变量的值
例如
Int fun(int n)
{
Static int f = 1;
F = f * n;
Return n;
}
Int main()
{
For(int i = 1; i < 4 ;i ++)
{
Printf(“fun(%d)=%d”,i,fun[i]);
}
}
Output
Fun(1)=1;
Fun(2)=2;
Fun(3)=6;
去掉static
Int fun(int n)
{
int f = 1;
F = f * n;
Return n;
}
Int main()
{
For(int i = 1; i < 4 ;i ++)
{
Printf(“fun(%d)=%d”,i,fun[i]);
}
}
Output
Fun(1)=1;
Fun(2)=2;
Fun(3)=3;
2 变量定义
在全局变量的前边加上static后,就定义了静态全局变量,静态全局变量的存储方式肯定是静态的,但是加上了static关键字后,作用域就会发生改变了,只能在文件内部使用,不可以再同程序的其他文件使用,非静态的全局变量在各个源文件中都是有效的。非静态的全局变量在各个源文件中都是有效的。