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

------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];

//NSObject和id都可以指向任何对象

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

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

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

instancetype和id都是万能指针

 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)自定义构造方法的规范
40     (1)一定是对象方法,以1号开头
41     (2)返回值一般是id类型
42     (3)方法名一般以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)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
时间: 2024-12-11 18:00:12

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

黑马程序员---Objective-C基础学习---编译器特性@property和@synthesize

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 编译器特性@property和@synthesize 1.@property @property可以自动生成某个成员变量的setter和getter声明. 新建一个项目,添加Person类. Person.h // // Person.h // zijia // // Created by zou on 5/10/15. // Copyright (c) 2015 __MyCompanyNam

黑马程序员--oc基础第八篇

八. oc基础知识(Protocal) protocal 出发点:他仅仅是用来声明方法的. 1. 可以用来声明一大堆方法(但是不能声明成员变量) 2. 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 3. 只要父类遵守了某个协议,就相当于子类也遵守了 4. 协议列出了一组方法,有些是必须实现的,有些是选择实现(@optional).遵守协议就要实现协议里面所有必须实现的方法.         1. 定义一个协议 协议格式的编写 @protocol协议名称//为协议起一个有意义的名

黑马程序员---OC基础8【block类型】【Protocol】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [block类型] 1.block概念 block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量 方法的回调 block是一个类型,定义变量,用来存储代码块 2.block基本用法 block与函数很相似,有返回值类型,参数类型,主体: 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { }; 没有参数可以写void,比如:i

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release

黑马程序员---OC基础9【Foundation框架】【NSString介绍】【NSURL读写字符串】【NSString字符串比较】【NSString前后缀检查及搜索】【NSRange使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [Foundation框架] 1.Foundation框架介绍 1)Foundation框架概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合 以便使研发程序变得 更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架 2)Foundation框架的作用 Foundation框架是Mac\iOS中其他框架的基础 Foundat

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

黑马程序员--oc基础第九篇(Foundation框架上)

九 . oc基础(Foundation框架上) 1.四中结构体类型:NSRange,NSPoint,NSSize,NSRect 1>NSRange:是一个以为的结构由成员location和成员length共同组成. *NSRange的创建方式:NSRange range=NSMakeRange(2.4),代表范围是从2开始一直到5,location为2,length为4 *NSString *[email protected]“I love you”:NSRange range=[str ran

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

黑马程序员--oc基础第五篇

五.oc的语法基础(内存管理上) 1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1. *给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身) *给对象发一条release消息,则计数器的值-1 *可以给对象发送retaincount消息来获取当前引用计数器的值 *当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super deall