特性:@property @synthesize
@property是一种新的编译器功能,表示声明了一个新对象的属性;存在于接口部分(interface)。
例如:@property NSString * name; 表示某类的对象具有NSString类型的属性,其名称为name, 也就是@property NSString * name;取代了-(void)setNSString *name;这条语句。
@synthesize也是一中新的编译器功能,表示创建该属性的访问器;存在于实现部分(implementation)
@synthesize name;这行代码实现了对name的设置和返回功能,因为编译器遇到@synthesize name;代码时编译器将输出-setNSString *name和-getNSString *name方法的已编译的代码。
注意:特性的局限性:当对象方法中有多个“参数”的情况时不能用@property和@synthesize实现。
Static:静态成员
在Objective-C 的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中 。不过可以调用这个类的方法间接的修改这个静态变量的值。
警告: static 写在interface外面编译是没有错误的,但是编译器会报警告,这么说这样的写法是不被编辑器认可的。
错误:static 写在interface里面会直接报错,显然这样的语法是不被认可的。
static关键字声明的变量必须放在implementation外面,或者方法中,如果不为它赋值默认为0,它只在程序开机初始化一次。
在Objective-C中如何实现像C++中那样的静态成员变量:
举例说明使用形式:
需要做的是在一个类A的implementation(.m或者.mm)文件中定义一个static变量,然后为A类定义静态成员函数(class method,也就是类方法)来操作该变量。
这样在其它类中你就不需要创建A类的实例来对static变量进行访问。虽然该static变量并不是A类的静态成员变量,但是也算达到了同样的效果。static变量的作用域被限制在单一的文件中。代码可以如下所示:
//example.h
@interface Example : NSObject {
}
- (id)init;
+(int)instanceCount;
@end
//example.m
#import "example.h"
static int count;
@implementation Example
-(id)init{
if(self = [super init])
{
count+=1;
}
return self;
}
+(int)instanceCount{
return count;
}
@end
上面的例子中你就可以通过[Example instanceCount]对静态变量count进行访问,无须创建实例。
+(void)addCount 标志+号后不用创建这个对象通过类名可以直接调用这个静态方法。 而之前方法前用过的-号,标志-号后的方法必须通过本类的对象或者在本来中才可以使用。所以这个方法无需使用这个类的对象调用。
直接使用类名方可调用这个方法:
#import "MyClass.h"
static int sCount = 100;
@implementation MyClass
+(void)addCount
{
sCount ++;
NSLog(@"静态整型变量的值为:%d", sCount);
}
@end
协议:protocol
一个子类只能继承一个父类,但子类可以使用多个协议。采用协议的方法是在类的@interface声明中列出协议的名称,采用协议意味着你必须实现协议中的所有方法,否则会产生警告。
例如:已经创建好了一个类Gun,他继承的父类是Arm,同时我也声明好了一个协议Sound,则Gun采用协议Sound的形式如下:@interface Gun:Arm
当采用多个协议时格式如下:
@interface Gun:Arm
内存管理:当你使用alloc、copy或者new方法获得一个对象时,该对象的保留计数器的值为1,而且你要负责释放它(当然,如果有自动释放池就不用了)。