点语法 @property语法 id指针

本文介绍了iOS开发中的点语法和@property的使用,详细讲解了从xcode4.4前后的变化,包括如何为类添加属性以及自动生成setter和getter的方法。此外,还探讨了id指针的特性,它作为万能指针允许编译时不进行类型检查,但在运行时可能导致错误。文章强调了编译时和运行时的区别,并比较了id指针与NSObject*指针的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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方法
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值