IOS学习第22天
点语法
1.点语法: 相当于调用方法.
对象名.name = @"xxx";
//相当于 [对象名 setName:@"xxx"]
对象名.age = 19;
//相当于 [对象名 setAge:19];
对象名.xxx = @"20";
//相当于 [对象名 setXxx:@"20"];
NSString * name = [对象名 name];
NSString * name1 = 对象名.name;
总结:点语法的使用
如果点语法出现在赋值号左边,相当于赋值
那么这个语法就是调用了对象的 setXXX方法
1>点语法使用在赋值符号的左边
对象.xxx = 值 -----> [对象 setXxx:值];
如果点语法出现在等号右边 那么相当于取值
这个点语法就是调用了对象的getter方法//getter方法不是已get开头
当点语法单独使用的时候,一般都是取值
2>点语法使用在赋值符号的右边
变量 = 对象.xxx -----> [对象 xxx];
注意:我们写的代码中 点语法 只操作属性
注意作用就是 给对象的属性赋值的时候 可以省略一些代码
点语法的注意事项:
1.点语法 是xcode的特性,在编译之前,xocde会把点语法替换成对象的方法
2.对象.name = @"zhangsan"====>[对象 setName:@"zhangsan"];
所以说 在使用点语法之前 必须有对象方法
```
###@property和@synthesize的使用
* @property
1.在xcode4.4之前 @property 在.h使用
作用:自动生成setter和getter方法的声明
“格式:@property 数据类型(和属性相同) 去掉下划线的属性名
注意:”单独”使用@property的时候 他只会自动生成setter和getter方法的声明
1.格式 (在xcode4.4之后)
@property 数据类型 去掉下划线的属性
1>自动生成属性的getter和setter方法的声明(.h中)
2>自动生成属性的getter和setter方法的实现(.m中)
3>不会生成不带下划线,而会生成带有下划线的(如果不存在)
4>在getter和setter方法的实现中 操作的就是带有下划线的属性
2.在xcode4.4之后 要给类添加一个属性
一部操作:在.h中 @property 数据类型 不带下划线的属性名
pragma mark - 11 使用@property增强注意 [掌握]
1.@property 数据类型 去掉下滑线的属性名
会生成带有下划线的属性,而且这个属性是真私有属性
2.@property 自动生成的getter和setter方法的实现中,在setter方法中是直接赋值的,
在getter方法中是直接返回
如果你自己需要在getter方法或者setter方法中做一些逻辑判断
只要在.m自己去实现,自己实现的方法 @property不会再帮你生成了
注意:如果你同时自己实现了getter和setter,那么@property 不会帮你生成带有下划线的私有属性
那必须自己在.m中添加一个带有下划线的属性
```
- synthesize
1.在xcode4.4之前,@synthesize 在.m使用
作用:自动生成setter和getter方法的实现
"格式:@synthesize 去掉下划线的属性名
注意:
在xcode4.4之前,@property 和@synthesize "配合"使用的时候
不仅可以自动生成getter和setter方法的声明,还可以自动生成getter和setter方法的实现
还可以自动生成对象的属性 "但是这个属性的名字 是不带下划线
2.注意:[xcode4.4之前]
1>@property 和@synthesize一起使用的时候 可以自动生成属性 ,但是这个属性是不带下划线的
2>在.h中 我们不去掉属性,也会自动生成一个不带下划线的属性
3.默认@synthesize 实现中 给自己生成的那个不带下划线的属性赋值的
4.做一个操作,目的是告诉@synthesize 第一你别给我生成不带下划线
第二:你给我操作 我那个带有下划线
"格式@synthesize 去掉下划线的属性名 = _属性名
1>不会生成不带有下划线的属性
2>操作的就是我们写的那个带有下划线的属性
```
###任意指针可以指向任意的对象
1.OC是一门弱语法的语言
编译器对源代码容错性较强,一些明显的逻辑性错误只是报警告,并不报错
2.弱语言的缺点
如果有逻辑错误编译的时候可以通过,但是直到运行的时候才会把错误暴露出来,导致程序崩溃
3.动态类型和静态类型
1>静态类型:什么样的指针就指向了什么样的对象
2>动态类型:指针的类型和指针指向的真实类型不一致
###编译检查 运行检查
1.什么时编译检查?
编译检查:程序运行之前的检查.就看这个指针定义时候的类型是否拥有某个方法
2.什么是运行检查?
运行检查:程序运行过程中检查,就看这个指针对象的类型是否拥有某个方法
口诀:
编译时看左边,运行时看右边
NSString * str = [Dog new];//不会报错,OC弱语法
调用方法:
[str eat];//编译的时候报错
[str length];//编译的时候不会报错,运行时报错
[(Dog *)str eat];//编译的时候 不会报错,运行时也不会报错
报错信息:
reason: ‘-[Dog miaomiao]: unrecognized selector sent to instance 0x100501430’
这种信息通常表示 运行时对象没有 上面说的那个”miaomiao”方法
编译的时候 编译器说了算
运行的时候 运行时说了算
###NSObject万能指针和id指针
.NSObject 指针 是一个万能指针
可以指向任何对象,编译不会报错(因为OC是弱语法) 也不会警告(里氏替换原则)
#import "HMPerson.h"
//HMPerson类中有一个方法 叫做 - lenght
@interface HMPerson : NSObject
@property NSString * name;
- (NSUInterger)length;
@end
@implementation HMPerson
- (NSUInterger)length
{
return 10;
}
@end
int main(int argc, const char * argv[]) {
NSObject *obj = @"1234";//万能指针 指向了一个 OC字符串对象
// [obj length];报错 因为编译时只看指针的类型,没有lenght方法 所以报错
unsigned long len = [(HMPerson *)obj length];
NSLog(@"%lu",len);//编译直接报错 解决[(NSString *)obj length]
return 0;
}
“NSObject * 指针有一个缺点
NSObject * 指针指向了一个自己定义的对象的时候,想通过这个指针调用自己定义的对象的方法时
必须强转,避免编译器报错
1.id类型 是一个typedef过的指针类型
所以声明 id变量的时候不需要加”*”
2id 和 NSObject *都是万能指针,他们的区别在于
指针类型是NSObject * 那么编译时会做编译检测
id指针 那么编译直接通过
3.id指针的优缺点
优点:不做任何的编译检查
缺点:不做任何的编译检查
不能通过id指针使用点语法,但是可以直接调用getter和setter方法
“`