是类的隐藏的参数,指向当前调用方法的类或对象。谁在调用,self就代表谁。(出现在对象方法中,就代表对象,出现在类方法中 就代表类 )
使用场景:
在当前类中,如果一个方法(类方法 和 对象方法皆可)需要调用本类的另一个方法,则可以通过self来。
super关键字用于子类调用父类的属性和方法。
使用场景:
子类重写父类的方法,但有需要保留父类的方法时,则可以用super关键字调用父类的方法。
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和property是相对应的,用于生成set/get方法的实现
实现存取器:
@synthesize propertyName=_成员变量名;
在实现类总如果出现@synthesize 关键字,就会去.h文件中找 对应的propertyName
@implementation Cat @synthesize age = _age; @synthesize name = _name; @end;
注意点:
@property 和 @synthesize 在实现声明的时候,赋值给成员变量的名字不同,synthesize是以property后面的名字为成员变量。property会在前面加上“_”;
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