标签:
------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)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】
标签:
原文地址:http://www.cnblogs.com/snowimba/p/4855880.html