1、属性:在定义类的接口时,有成员属性和方法两部分;
1、@interface与 @property的区别
1)@interface大括号中声明的是“成员变量”;
2)@property声明的是“属性”, @synthesize与@property配对,意义是“合成”。
成员变量与属性的区别主要分为以下两点:
1)、在@interface中定义变量的话,为当前类的私有(private),顾名思义,这些变量只能在当前类中被访问;而用@property声明的变量为公有(public),可以在当前类或者其他类中被访问。
2)、使用@interface声明的变量,使用变量名进行访问;@property声明的变量用“ _变量名”(不用@synthesize的方式,后面会提及),或者“self.变量名”的形式进行访问。
2、 成员属性设的设定可以用setter方法,成员属性的访问可以用getter方法,objective-c中有另外一组代替该种方法的关键字
@property,它与@synthesize成对使用,前者用在头文件中,等效于在头文件中声明了两个方法,
例如:
@property int number;
等价于
-(void)setNumber:(int) n;
-(int) number;
而@synthesize后者用在.m文件中等价于在.m文件中实现两个方法,如@synthesize等价于:
-(void)setNumber:(int)n
{
Number=n;
}
-(int) number
{
return number;
}
以上等效的函数部分由编译器自动填充完成,不需要开发者再重复编写代码,简化了编码输入工作量。
3、声明格式:
声明@property的格式为
@property(参数1,参数2)参数类型 参数名;
其中参数主要分为三类:
读写属性: (readwrite/readonly)
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite:是默认的,产生setter\getter方法
readonly:只产生简单的getter,没有setter。
assign:默认类型,setter方法直接赋值,而不进行retain操作。用于基础数据类型和c类型数据,如int、float、double和NSInteger,CGFloat,bool等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。
retain:setter方法对参数进行release旧值,再retain新值。修饰其他NSObjective及其子类。
copy:setter方法进行Copy操作,与retain一样。可以修饰字符串、遵循NSCoding协议的对象,不能修饰数组和字典。
nonatomic:禁止多线程,变量保护,提高性能。
atomicity:允许多线程。
weak:weak跟assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak智能用在iOS 5或以后的版本,对于之前的版本,使用unsafe_unretained。
strong:是在ARC伴随IOS引入的时候引入的关键字是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。
2、全局变量和静态变量:
全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件中说明);
静态变量(static)存放在内存的数据区(堆)中的,在程序开始运行前就分配固定字节,在程序运行过程中被分配的字节大小是不变的。只有程序运行结束后,才释放所占用的内存。它的作用域取决于静态变量的位置,若在函数里,作用域就是这个函数。在模块内(但在函数体外),静态变量可以被模块内的函数使用,但是不能被模块外的其他函数访问,是一个本地的全局变量。
静态全局变量,是定义存储类型为静态的全局变量,只有本文件可以用,虽然整个程序包含多个程序,但静态全局变量只能作用在它定义的那个文件里,
全局变量和静态变量都在堆里,局部变量存放在栈里。
3、协议
协议(protocol)是oc里一种特有的继承方式,它声明了一系列方法,却不实现,仅仅是定义了其他对象有责任实现的接口,里面的方法可以被任何一个类实现。在objective-c中,一个子类只可以继承自一个父类,而一个类可以有多个协议。
(1)定义一个协议的格式:
@protocol 协议名
@required
方法声明 1;
方法声明 2;
...........
@optioal
方法声明 1;
方法声明 2;
..........
@end
@required 表示我们用到这个协议的时候必须实现这个协议的方法。
@optional 表示我们可选择性实现以下声明的这些方法,看那个需要我们就去实现,不需要的就不实现。
例如,要定义一个名为Sound 的协议,里面有一个名为makesound的方法,该方法必须在类里实现,然后还有名为dosomething的方法,可以实现,也可以不实现。首先创建一个名为Sound.h的头文件,定义如下:
@protocol Sound
@required
-(void) makesound;
@optional
-(void) dos0meting;
@end
(2)当某个类要采用这个协议时,首先包含该协议所在的头文件用#import “Sound.h”,例如Class A要采用该协议
ClassA.h中的代码如下:
#import<Foundation/Foundation.h>
#import"Sound.h"
@interface ClassA:Object <Sound>
原来的代码;
@end
当一个类要采用多个协议时,除了导入相应的协议文件外,还需要在后面的尖括号中以逗号隔开,加入协议名称。协议中的方法已经在协议文件中说明,此处不用再次声明,只需要在要扩展类的实现文件中实现协议中声明的方法即可。
ClassA.m中的代码如下:
#import”ClassA.h“
@implementation ClassA
原来的代码;
-(void) makesound
{
实现代码;
}
@end
协议的两个修饰符@optional和@required,由修饰符修饰的方法,前者代表采用该协议的类中可以选择不实现该方法,后者代表采用该协议的类必须实现该方法。协议修饰符的默认值为@required,实现。