黑马程序员——OC---OC特有语法01

本文深入探讨了Objective-C语言中的点语法及其本质,详细解释了如何使用点语法调用方法而非访问成员变量,并阐述了成员变量的作用域,包括@public、@protected、@private和@package四种访问级别。同时介绍了@property和@synthesize的作用,以及id类型的使用场景,最后讲解了构造方法的创建与重写规范。

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一 点语法

OC设计点语法的目的,是为了让其他语言的开发者可以很快的上手OC语言开发,使用点语法,让它和其他面向对象的语言如java很像。其调用方法如下:

    Person *p = [Person new];
    
    p.age = 10; // [p setAge:10];
    
    int a = p.age; // [p age];
    
    p.name = @"Jack";
    
    NSString *s = p.name;
    
    NSLog(@"%@", s);
其实说到点语法的本质就是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。切记点语法的本质是转换成相应的setget方法,如果没有setget方法,则不能使用点语法。如:

Stu.age=10;展开为:[stu setAge:10];

int  a=stu.age;展开为:[stu age];

编译器如何知道是set方法还是get方法?主要是看赋值。OC中访问成员变量只有一种方式即使用-> stu->age,这种情况要求在@public的前提下。

另外,使用点语法时,应该注意,以下两种会出现出现的情况:、

(1)在set方法中,self.age=age;相当于是[self setAge:age];

(2)在get方法中,return self.age;相当于是[self age];

二 成员变量的作用域

局部变量、全局变量都有自己的作用域,成员变量也不例外,也有自己的作用域。变量的作用域主要分为四种:

(1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。

(2)@protected (受保护的)只能在当前类和子类的对象方法中访问

(3)@private (私有的)只能在当前类的对象方法中才能直接访问

(4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问

三 @property和@synthesize

@property用在@inteface中可以自动生成某个成员变量的setter和getter声明。例如用@property int age;就可以代替下面的两行:

- (int) age; //geter

- (void)setAge:(int)age; //setter

类似地,@synthesize用在@implementation中,用来自动生成setter和getter的实现,例如,@synthesize age = _age。注意,如果成员变量_age不存在,就会自动生成一个@private的成员变量_age。从新版本开始(4.2吧好像是),@synthesize已经不用了,因为@property已经可以自动生成声明和实现。

四 id类型

id在OC中是一个万能指针,可以指向任何的OC对象,相当于NSObject *,其定义如下。要注意,使用时,id后面不要加上*,例如id p = [Person new]。其局限性体现在,当调用一个不存在的方法时,编译器会马上报错。

typedef struct objc_class *Class; 
typedef struct objc_object { 
    Class isa; 
} *id; 
五 构造方法

对象的创建可以分为两步走:其中init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。默认初始化完毕后,所有成员变量的值都为0

1>+ alloc 方法  分配存储空间

   2>- init 方法初始化

我们在实际开发过程中经常需要对构造方法进行重写,重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值。在重写构造方法的 过程中应该注意,先调用父类的构造方法([super init]),再进行子类内部成员变量的初始化,重写构造方法的规范:例如代码如下:

 

(1)一定是对象方法,以减号开头

(2)返回值一般是id类型

(3)方法名一般以initWith开头

@implementation Person

// 重写-init方法
//- (id)init
//{
//    // 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
//    self = [super init]; // 当前对象 self
//    
//    
//    // 2.如果对象初始化成功,才有必要进行接下来的初始化
//    if (self != nil)
//    { // 初始化成功
//        _age = 10;
//    }
//    
//    // 3.返回一个已经初始化完毕的对象
//    return self;
//}

- (id)init
{
    if ( self = [super init] )
    { // 初始化成功
        _age = 10;
    }
    
    // 3.返回一个已经初始化完毕的对象
    return self;
}

@end






下载前必看:https://renmaiwang.cn/s/bvbfw Verilog设计_串并转换 / 移位寄存器实现了一种串并转换的功能,其核心原理在于移位寄存器的运用。 这里详细展示了串转并以及并转串两种不同的设计方案。 每一种转换模式都设有专属的使能信号,同时并行输出数据的格式提供了两种选择:最低有效位优先(lsb)和最高有效位优先(msb)。 串并转换技术主要应用于串行传输与并行传输这两种数据传输模式之间的相互转换,而移位寄存器是达成这一目标的常用工具,能够支持并行及串行的数据输入与输出操作。 这些移位寄存器通常被设定为“串行输入、并行输出”(SIPO)或“并行输入、串行输出”(PISO)两种工作模式。 在串行数据输出的过程中,构成数据和字符的码元会按照既定的时间顺序逐位进行传输。 相比之下,并行数据传输则是在同一时刻将固定数量(普遍为8位或16位等)的数据和字符码元同时发送至接收端。 数据输入通常采用串行格式进行。 一旦数据成功输入寄存器,它便可以在所有输出端同时被读取,或者选择逐位移出。 寄存器中的每个触发器均设计为边沿触发类型,并且所有触发器均以特定的时钟频率协同工作。 对于每一个输入位而言,它需要经过N个时钟周期才能最终在N个输出端呈现,从而完成并行输出。 值得注意的是,在串行加载数据期间,并行输出端的数据状态应保持稳定。 数据输入则采用并行格式。 在将数据写入寄存器的操作过程中,写/移位控制线必须暂时处于非工作状态;而一旦需要执行移位操作,控制线便会变为激活状态,并且寄存器会被锁定以保持当前状态。 只要时钟周期数不超过输入数据串的长度,数据输出端Q将按照预定的顺序逐位读出并行数据,并且必须明确区分最低有效位(LSB)和最高有效位(MSB)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值