OC课堂随笔——类

1.类的定义

类=属性+方法

--属性代表类的特征

--方法是类能对变化做出的反应

类定义的格式:类的声明和类的实现组成

--接口(类的声明):@interface 类名:基类的名字

.类名的首字母要大写

.冒号表示继承关系,冒号后面的类是父类

.NSObject是所有类的基类

.类的声明放在“类名+.h文件中,要由两部分组成:实例对象和方法声明”

--实现(类的实现):@implementation类名

.方法实现

都用@结束

 

2.类的使用

.oc中对象通过指针来声明。如ClassA*object;

oc中对象的创建,使用alloc来创建一个对象。编译器会给对象分配一块可用的内存地址。然后需要对对象进行初始化即调用init方法,这样这个对象才可以使用。

如:

Person *person=[Person alloc];

person=[person init];

或者可写成:

Person *person=[[Person alloc] init];

.同一类的每个对象有不同的实例变量的存储空间,同一类的每个对象共享该类的方法。

.方法嵌套的形式来调用,如:ClassA *object=[[ClassA alloc] init];

 

3.类的访问权限

.三种访问权限

--公有的@public      类本身/子类/全部文件都能访问

--私有的@private    只有类本身可以访问

--保护的@protect    类本身和子类可以访问

属性默认的权限是保护的;

方法默认的权限是公有的;

 

4.方法的定义

.无参无返  -(void)print;

.无参有返 -(Person *)register;

有参无返 -(void)init : (int)newId;

有参有返 -(Person *)init:(int)newId;

 

5.多参数方法的定义

带一个参数的方法

--(Person *)init:(int) newId;

待两个参数的方法

-(Person *)init : (int) newId andAge :(int) newAge;

: 是方法名的一部分

-第一个方法名:init :

-第二个方法名:init :andAge :

-(Person *)initWithId:(int) newID andAge:(int) newAge andName:(NSString *)name;

可以在方法名前面加任意标记如“WithId”,“andAge”,“andName”以此类推

 

6.类方法和对象方法对比

.对象方法(实例方法)

--以减号-开头

--只能让对象调用,没有对象,方法不能被执行

--对象方法能访问实例变量(成员变量)

类方法

--以加号+开头

--只能用类名调用,对象不能调用

--类方法不能访问实例变量

--使用场合:当不需要访问成员变量的时候,尽量用类方法

--类方法和对象方法可以重名

 

实例:

main.m:

#import <Foundation/Foundation.h>
#import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象,即实例化对象 Dog *haShiQi=[[Dog alloc]init]; //方法调用 [haShiQi bark]; //属性赋值 haShiQi->health=120; haShiQi->name=@"哈士奇"; NSLog(@"狗的姓名:%@,健康值%d",haShiQi->name,haShiQi->health); } return 0; } 

Dog.m:类的实现

#import "Dog.h"     //引用类的声明文件 @implementation Dog //方法实现 -(void)bark{ NSLog(@"汪汪"); } @end

Dog.h:类的声明

#import <Foundation/Foundation.h>
@interface Dog : NSObject   //声明类Dog,继承根基类NSObject
//类的属性 { @public; //设置类的属性为公有(一般不允许使用) NSString *name; int health; } //对象方法 -(void)bark; @end 

7.属性的存取方法:

获取属性值(getter)方法的定义

--作用:返回对象内部的成员变量

--命名规范:get方法的名一般和成员变量同名;

获取属性值(setter)方法的定义

--作用:用来设置成员变量,可以在方法里过滤掉一些不合理的值

--命名规范:

--方法都是以set开头,而且后面跟上成员变量名,首字母必须大写

--形参名称不要和成员变量同名

 

8.getter和setter方法实例

main:

#import <Foundation/Foundation.h>
#import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象,即实例化对象 Dog *haShiQi=[[Dog alloc]init]; //方法调用  [haShiQi bark]; //属性赋值 [haShiQi setName:@"哈士奇"]; //调用setter方法赋值 [haShiQi setHealth:120]; NSLog(@"狗的姓名:%@ 健康状况:%d",haShiQi.name,haShiQi.health); } return 0; }

Dog.m:类的实现

#import "Dog.h"     //引用类的声明文件 @implementation Dog //方法实现 -(void)bark{ NSLog(@"汪汪"); } //setter方法 -(void)setName:(NSString *)newName{ name=newName; } //getter方法 -(NSString *)name{ return name; } //setter方法 -(void)setHealth:(int)newHealth{ health=newHealth; } //getter方法 -(int)health{ return health; } @end 

Dog.h:类的声明

#import <Foundation/Foundation.h>
@interface Dog : NSObject   //声明类Dog,继承根基类NSObject
//类的属性 { NSString *name; int health; } //对象方法 -(void)bark; -(void)setName:(NSString *)newName; //setter方法 -(NSString *)name; //getter方法 -(void)setHealth:(int)newHealth; -(int)health; @end

9.自动生成属性的存取方法

@property语法

@synthesize

封装的好处

--过滤掉不合理的值

--屏蔽内部的赋值过程

--让外界不必关注内部的细节

 

10.自动生成属性的存取方法实例

main:

#import <Foundation/Foundation.h>
#import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象,即实例化对象 Dog *haShiQi=[[Dog alloc]init]; //方法调用  [haShiQi bark]; //属性赋值 [haShiQi setName:@"哈士奇"]; [haShiQi setHealth:120]; NSLog(@"狗的姓名:%@ 健康状况:%d",haShiQi.name,haShiQi.health); } return 0; }

Dog.m:类的实现
#import "Dog.h"     //引用类的声明文件 @implementation Dog //方法实现 -(void)bark{ NSLog(@"汪汪"); } @synthesize name,health; //封装,代替了setter,getter @end

Dog.h:类的声明
#import <Foundation/Foundation.h>
@interface Dog : NSObject   //声明类Dog,继承根基类NSObject
//类的属性 { @public; //设置类的属性为公有 NSString *name; int health; } -(void)bark; @property int health; //封装,代替了setter,getter @property NSString *name; @end

11.方法重载
·OC中不是严格的函数重载

命名冲突:

-(int)doSomething(int)X;

-(int)doSomething(float)X;

命名冲突:

-(int)doSomething(int)x:(int)y;

-(int)doSomething(float)x:(int)y;

不冲突:

-(int)doSomething(int)x:(int)y;

-(int)doSomething(int)x: andY:(float)y;

因为一个是“doSomething:”,“另一个是doSomething::”

 

12.继承

·不改变原来模型的基础上,拓充方法

·建立了类与类之间的联系

·抽取了公共代码

·减少冗余代码

·坏处:耦合性强

 

转载于:https://www.cnblogs.com/jiangyicheng/p/5103897.html

OC(Objective-C)是一种面向对象的编程语言,它支持在中使用方法和block。方法是在中定义的方法,可以直接通过名来调用,而不需要实例化对象。而block是一种闭包,可以在代码中定义并传递给方法或函数,用于延迟执行特定的逻辑。 在OC中,可以使用方法来创建和操作的实例,例如通过一个工厂方法创建对象,或者在方法中实现一些与相关的逻辑。方法通常使用“+”符号进行声明和实现。 而block可以在方法中作为参数传递,也可以在方法中定义和使用。block可以捕获其所在作用域的变量,可以在方法内部延迟执行一段代码,也可以用于实现回调等功能。block的定义和使用使用“^(){}”语法。 方法和block可以结合使用,例如可以在方法中接受一个block作为参数,并在合适的时机调用该block,以实现一些灵活的逻辑。通过方法和block的组合,可以在OC中实现更加灵活和强大的功能,例如在异步操作中使用block来回调结果,或者在工厂方法中使用block来定制对象的初始化逻辑等。 总而言之,方法和block是OC中的两个重要特性,它们可以分别用于的操作和延迟执行逻辑,也可以结合使用以实现更加灵活的功能。在实际的OC开发中,方法和block通常会被广泛使用,可以帮助开发者更加简洁和灵活地实现代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值