一 关键字
self
是类的隐藏的参数,指向当前调用方法的类或对象。谁在调用,self就代表谁。(出现在对象方法中,就代表对象,出现在类方法中 就代表类 )
使用场景:
在当前类中,如果一个方法(类方法 和 对象方法皆可)需要调用本类的另一个方法,则可以通过self来。
super
super关键字用于子类调用父类的属性和方法。
使用场景:
子类重写父类的方法,但有需要保留父类的方法时,则可以用super关键字调用父类的方法。
property
1)@property 用来生成 的声明,是编译器的特性。
2)使用@property关键字时,如果不声明成员变量,编译器会在默认的.m文件中,作用域为private。如果子类中需要使用该成员变量,则需要手动声明。
声明存取器:
@property 属性 数据类型 成员变量名
属性说明:
assign 直接给属性赋值,不需要进行引用计数。用于基本数据类型。
retain,在给属性赋值的时候,先release之前的值,然后再赋新值给属性,引用计数器(retainCount)再加1。
copy 在给属性赋值的时候,会在内存开辟新的空间,为引用计数器(retainCount)为1的对象。
readonly表示这个属性是只读的,就是只生成getter方法,不会生成setter方法。
strong 默认创建的指针都是强指针。 系统判断对象是否被回收的依据,只要没有强指针指向该对象,该对象就会被释放。
weak 不会影响到对象的回收。
natomic 默认属性,在多线程情况下会生成一些互斥加锁代码,避免变量的读写不同步的问题。
nonatomic 非原子性访问,不加同步,多线程并发访问会提高性能。
@interface Cat : NSObject
@property (nonatomic,assign)NSInteger age;
//因为字符串创建在常量区,如果值发生变动,则其他指针指向该值 访问的 值也会变动。
//copy属性 在给属性赋值的时候,会在内存开辟新的空间,创建新的对象。
@property (nonatomic,copy)NSString * name;@end
注意:xcode 4.4以后的版本 @property 同时完成了声明和实现,不需要在.m文件中再用@synthesize关键字实现了。
synthesize
synthesize和property是相对应的,用于生成set/get方法的实现
实现存取器:
@synthesize propertyName=_成员变量名;
在实现类总如果出现@synthesize 关键字,就会去.h文件中找 对应的propertyName
@implementation Cat
@synthesize age = _age;
@synthesize name = _name;
@end;
注意点:
@property 和 @synthesize 在实现声明的时候,赋值给成员变量的名字不同,synthesize是以property后面的名字为成员变量。property会在前面加上“_”;
id类型
id是数据类型 ,可以用来当做变量,参数,返回值。是个万能指针。可以保持任何对象的地址。
id相当于NSObject,但是有区别:
1)调用子类特有的方法,id是动态类型(在运行时,才确定id的真实类型)不用强制转换,NSObject则需要强制转换。
二 代码
创建Animal类 和 子类Cat,运用以上关键字。
1.Animal类
===类声明
@interface Animal : NSObject
{
//使用@property关键字时,如果不声明成员变量,编译器会在默认的.m文件中,作用域为private。
//如果子类中需要使用该成员变量,则需要手动声明。
int _age;
NSString * _name;
}
//@property 声明 get set 方法
@property (nonatomic,assign)int age;
@property (nonatomic,copy)NSString * name;
-(void)run;
-(void)eat;
@end
===类实现
@implementation Animal
//synthesize 用于 实现@property声明
@synthesize age = _age;
@synthesize name = _name;
-(void)run
{
NSLog(@"run...");
}
-(void)eat
{
NSLog(@"eat...");
}
@end
2.Cat类
===类声明
@interface Cat : Animal
//control方法 用于调用 Cat类的 eat run 方法
-(void)control;
@end
===类实现
@implementation Cat
-(void)run
{
NSLog(@"cat");
//通过super调用父类的方法
[super run];
}
-(void)eat
{
NSLog(@"cat");
//通过super调用父类的方法
[super eat];
}
-(void)control
{
//用self 调用 本类的其他方法
NSLog(@"--调用run方法--");
[self run];
NSLog(@"--调用eat方法--");
[self eat];
}
@end
3.主函数
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"=====Anial调用=====");
Animal *animal = [[Cat new]init];
[animal eat];
//[animal control]; //父类不能调用子类特有的方法
NSLog(@"=====id调用=====");
id cat = [[Cat alloc]init];
[cat control];
}
return 0;
}
输出:
2014-10-20 01:43:09.817 09关键字[326:303] =====Anial调用=====
2014-10-20 01:43:09.819 09关键字[326:303] cat
2014-10-20 01:43:09.819 09关键字[326:303] eat...
2014-10-20 01:43:09.819 09关键字[326:303] =====id调用=====
2014-10-20 01:43:09.820 09关键字[326:303] --调用run方法--
2014-10-20 01:43:09.820 09关键字[326:303] cat
2014-10-20 01:43:09.820 09关键字[326:303] run...
2014-10-20 01:43:09.821 09关键字[326:303] --调用eat方法--
2014-10-20 01:43:09.821 09关键字[326:303] cat
2014-10-20 01:43:09.821 09关键字[326:303] eat...
Program ended with exit code: 0