点语法 @property语法 id指针

来源:互联网 发布:端口监听命令 编辑:程序博客网 时间:2024/05/18 01:48

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;}@endint 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方法
“`

0 0