OC学习笔记十三 关键字

一 关键字
  • 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



    

转载于:https://my.oschina.net/wolx/blog/335237

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值