码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

时间:2015-10-05 16:48:27      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

点语法

 1 1、使用“点语法”
 2               Student *stu= [[Student alloc]init];
 3             //调用set方法
 4             [stu setAge:20];
 5             [stu setName:@"Jone"];
 6             //点语法:xcode的特性,Xcode帮我们做了代码替换
 7             //点语法,通过对象点属性名
 8             //此时并不是之间访问实例变量
 9             //而是Xcode看到点语法后,会帮我们自动替换成stu.age = 18;--》[stu setAge:20];
10             stu.age = 18;
11             stu.name = @"张三丰";
12             //调用get方法
13             //注意,此处点语法出现在了等号的右侧
14             //实际上,当Xcode看到点语法出现在等号的右侧后,
15             //它会帮我们自动替换成int a = stu.age;---》[stu age]
16             int a = stu.age;
17             NSLog(@"%d,%@",a,[stu name]);
18             //强调:点语法到底是替换成set方法还是get方法,一般取决于
19             //点语法出现在等号左侧还是右侧,是设置值还是获取值
20 2、点语法注意:
21     1)oc中有个self关键字,
22     -(void)setAge:(int)age{
23         self.age = age;
24     }
25     -(int)age{
26         return self.age;
27     }
28     这两种情况会造成死循环
29 2)点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法,是方法调用,不是访问成员变量

【@property关键字

 

1、基本概念

 

    @property是编译器的指令

 

    声明属性的访问器(get/set)方法

 

    可以免去手工写get和set方法

 

2、@property用法

 

    @property     类型名  方法名

 

    @property       int          age

 

    相当于声明了set和get方法

 

 1     @property int age;
 2 
 3 /*
 4 
 5  -(void)setAge:(int)age;
 6 
 7  -(int)age;
 8 
 9  */
10 
11

 

 

3、使用注意

 

  1)@property只能写在@interface   @end中

 

  2)@property用来自动生成成员变量的set/get方法声明

 

 

      int _age;

 

      NSString *_name;

 

      int _sg;

 

  }

 

  @property int age,sg;

 

  类型一样可以写在一起

 

 

 

4、@property增强使用

 

  Xcode4.4之后,可以只使用@property而不使用@synthesize声明

 

  操作的是带有下划线的实例变量

 

  如果当前类没有下划线的实例变量,则系统会帮我们生成

 

  @property int age,sg;

 

  可以自动生成实例变量 int _age;int _sg;生成的变量是完全私有的,不能继承。隐藏的

 

  可以自动生成对应变量的set和get方法的声明和实现

 

 

 

5、@property下重写get和set方法

 

  手动实现get和set方法,增加一个判断筛选,防止非法赋值

 

    -(void)setAge:(int)age{

 

        if (age>=0) {

 

            _age = age;

 

        }

 

 

    }

 

    注意:get和set方法只能重写一个,不能两个一起写

 

    如果要一起写,就要加@property

 

 

【@synthesize关键字

1、用法

    在.m文件中帮我们实现get/set方法

    注意要先在声明中定义方法名

    @property int age;

    @implementation Student

    @synthesize age;

    @end

    @property int age,sg;

    @synthesize age,sg;

    可以写一起

2、@synthesize指定实例变量赋值

    一般形式:

    @synthesize   a = _b;表示用a的get和set方法给修改成员变量b的值

    @synthesize age,sg;

    @synthesize age = _age,sg = _sg;

    操作的是指定的变量_age,不再是默认的age

 

【id类型】

 

1、用NSObject访问子类对象方法

//NSObject访问子类特有方法run

        NSObject *obj = [[Animal alloc]init];

        [(Animal*)obj run];

        //访问子类特有方法

        NSObject *obj2 = [[Dog alloc]init];

        [(Dog*)obj2 run];

        //NSObject是所有类的基类

        //NSObject可以指向任何子类

 

2、id类型

id是一通用的对象类型,它可以用来存储属于任何类的对象

也可以理解为万能指针

3、id类型使用

  //注意id的使用

        //id类型的使用

        id obj3;

        obj3 = ani;

        [obj3 run];

        obj3 = ani2;

        [obj3 run];

        //NSObjectid都可以指向任何对象

        //NSObject对象会进行编译检查(需要强制类型转换)

        //id不需要强制类型转换,id可以直接用

        //编译器看到id以后,认为是动态类型,不在检查类型

 

instancetypeid都是万能指针

 4、id应用场景

可以调用对象的同名方法

代理

 

 

 

【动态类型】

1、动态类型和静态类型概念

    多态:允许不同的类对应相同的方法 

    动态类型:程序直到执行时才能确定所属的类

     Animal *c = [[Cat alloc]init]

    静态类型:将一个变量定义为特定类的对象时,使用的是静态形态

2、动态类型

    委托模型,或者代理模式

    编译时进行检查,不会报错

    运行时进行检查,会报错

 1 1、动态绑定
 2     1)在OC中一个对象是否调用指定方法,不是编译器决定的,而是运行时决定的
 3     
 4 2、动态类型检测
 5     对象在运行时获取其类型的能力称为内省,内省可以有多种方法实现
 6     1)判断类型
 7     -(BOOL)isKindOfClass :classObj 判断实例对象是否是这个类或者这个类的子类的实例
 8     Animal *ani = [Animal new];
 9             //ani是否是Animal类的实例对象
10             //动态类型检测
11             //1)判断类型
12             //格式:[对象 isKindOfClass:[类对象 class]]
13             BOOL isInstance = [ani isKindOfClass:[Animal class]];
14             NSLog(@"%d",isInstance);
15             //d是animal子类Dog的实例对象,所以是1
16             Dog *d = [Dog new];
17             BOOL isInstance1 = [d isKindOfClass:[Animal class]];
18             NSLog(@"%d",isInstance1);
19             //stu不是animal的实例对象,所以是0
20             Student *stu = [Student new];
21             BOOL isInstance2 = [stu isKindOfClass:[Animal class]];
22             NSLog(@"%d",isInstance2);
23     
24      //2)判断类型isMemberOfClass判断只管本类的,不管子类
25             //格式:[对象 isMemberOfClass:[类对象 class]]
26             Dog *d1 = [Dog new];
27             BOOL isInstance4 = [d1 isMemberOfClass:[Animal class]];
28             NSLog(@"%d",isInstance4);
29     //3)判断类型,判断类和类之间的关系,isMemberOfClass判断只管本类的,不管子类
30             //格式:[类A isSubclassOfClass:[类对象B class]],判断类A是否是类B的子类
31             BOOL isInstance5 = [Dog isSubclassOfClass:[Animal class]];
32             NSLog(@"%d",isInstance5);
33 
34 3、判断对象/类能否响应指定的方法
35       /*
36              动态类型检测第二部分
37              1、方法响应的检测
38             */
39             Animal *ani = [Animal new];
40     //        [(Dog*)ani eat];
41             //1)判断实例对象能否响应(调用)指定的方法
42             SEL s = @selector(eat);//把eat包装成SEL类型
43             BOOL isRespond = [ani respondsToSelector:s];
44             if (isRespond) {
45                  [(Dog*)ani eat];
46             }else{
47                 NSLog(@"该对象不能调用此方法");
48             }
49     //2)判断类能否响应指定方法,类中是否存在指定方法
50     isRespond = [Dog instancesRespondToSelector:s];
51     isRespond = [Dog instancesRespondToSelector:@selector(run)];父类中继承的也可以响应
52     NSLog(@"%d",isRespond);
53     
54 4、响应方法
55     Animal *ani = [Dog new];
56             SEL s = @selector(eat);
57             if ([ani respondsToSelector:s]) {
58                 [(Dog*)ani eat:@"巧克力"];
59                 [ani performSelector:s];//作用,响应方法,响应无参方法
60             }else{
61                 NSLog(@"不能响应方法");
62             }
63     SEL s1 = @selector(eat:);
64             [ani performSelector:s1 withObject:@"巧克力"];//作用,响应一个参数的方法
65     SEL s2 = @selector(eat:and:);
66             [ani performSelector:s2 withObject:@"巧克力" withObject:@"大黄狗"];//作用,响应两个参数的方法
67     
68     

【构造方法】

 

1、构造方法

 

用来初始化对象的方法,是个对象方法,-开头

 

2、构造方法的调用

 

把方法new可以拆成

 

1)alloc分配存储空间

 

2)init初始化

 

3)返回对象首地址

 

其中init就是一个构造方法,用来初始化对象

 

 1     /*
 2      OC中的构造方法
 3         给对象进行初始化的方法
 4         init  是一个对象方法
 5               该方法返回值是一个对象(调用init方法的对象)
 6      OC的构造方法,学习重写构造方法,让对象创建成功后,就有初始值
 7      */
 8     
 9 3、重写构造方法
10     -(instancetype)init{
11         //防止父类初始化方法release掉了self指向的空间并重新alloc了一块空间,这时[super init];可能alloc失败,就不执行if语句
12         self = [super init];
13     //    判断父类是否初始化成功
14         if (self) {
15     //        此处写子类初始化的内容
16             _age = 10;//给年龄设置默认值为10
17             
18         }
19         return self;//self方法的调用者
20     }
21     
22     
23 4、super方法
24     Dog *d = [Dog new];
25             //执行顺序:子类-->父类-->父类的父类····->NSObject
26             [d run];
27     //        需求,要打印出动物跑
28     //        在子类的方法中,调用父类的run方法
29     //        
30     -(void)run{
31         [super run];
32         [super bark];
33     //    super指代的是父类对象
34         NSLog(@"狗在跑");
35     }
36     
37     
38 5、自定义构造方法
39     1)自定义构造方法的规范
401)一定是对象方法,以1号开头
412)返回值一般是id类型
423)方法名一般以initWith开头
43     2)代码实现
44     -(id)initWithName:(NSString*)name;//声明
45     //实现
46     -(id)initWithName:(NSString*)name{
47         if (self = [super init]) {
48             _name = name;
49         }
50         return self;
51     }
52     Person *p = [[Person alloc]initWithName:@"张三丰"];
53             NSLog(@"%@",p.name);
54     继承的使用
55     -(id)initWithName:(NSString*)name andNum:(int)num{
56         if (self = [super initWithName:name]) {
57             _num = num;
58         }
59         return  self;
60     }
61     
62     注意:
63         1)自己做自己的事情
64         2)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性

 

 

 

 

 

 

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

标签:

原文地址:http://www.cnblogs.com/snowimba/p/4855880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!