Objective-C学习笔记(一)–类

本文是Objective-C的学习笔记,主要讲解类的定义、实例化、成员变量和方法,包括变量的访问性、方法声明、选择器、属性、@class关键字、self关键字以及dealloc和initialize函数的作用。
摘要由CSDN通过智能技术生成

1、类的定义与实现

1.1说明

所有的类都是继承NSObject。类的接口与实现是分开的,一般类的定义是放在.h文件【包含类的名称、成员变量、方法、属性、继承关系、遵从的协议】;实现部分是放在.m文件中【包含每个属性和方法的具体实现以及协议的方法实现】

语法:【类的定义以@interface开头以@end结束;类的实现以@implementation关键字开头以@end结束】

Person.h

@interface Person:NSObject{
       //类的成员变量区【类的成员变量声明】
 
}
 
//类的方法与属性区【类的方法与属性的定义】
@end


 

Person.m

 

#import “Person.h”
@implementation Person{
 
 
}
@end


 

 

1.2实例化alloc

实例一个新的对象需要调用类的alloc静态方法。alloc方法一旦调用就表明了向内存申请了一个空间用来保存该类的信息。

具体流程是:alloc会查看所有该类及所有基类,统计出这些类一共定义了哪些成员变量,总共需要多大的内存空间用来保存这些信息,然后向操作系统发出请求申请这些空间,如果成功,alloc方法会将所有的成员亦是置为0,除了一个特殊的指向其类元对象的成员之外,然后返回这块申请下来的空间的首地址

 

流程图:

 

 

 

 

 

2、成员变量与方法

 

2.1变量

变量分为成员变量和类的静态变量。

成员变量

可访问性:@protected、@private、@public

关键字

可见性

描述

@protected

当前类及子类的实例方法可见

默认值,类里声明的成员变量的可访问级别默认为@protected。

 

@private

只对当前类的实例方法可见

私有访问级别

@publice

成员变量对外可见

 

 

变量的声明

@interface Person:NSObject{
 
@private    
       NSString*_name;
       int_age;
 
}


 

静态变量

使用static关键字表示,定义在类的实例部分中所有实例方法之外。类的静态变量对于实例方法和类方法都是可见的。

@implementation Person
 
       staticint NumberPerson=0;
 
@end


 

 

 

2.2方法

方法的声明语法

+|-(返回值类型)方法名;

+|-(返回值类型)参数1说明:(参数1类型)参数1名称  参数2说明: (参数2类型)参数2名称;

+:加号表示该方法是一个类的方法,类的静态方法,它不属于类的任何实例只属于该类。【类似于Java中的static方法】  调用格式为  [类  方法名]  例: [PersonsetMaxAge:20];

-:减号表示该方法的实例方法,属于实例。调用时必须先将实例化,然后再调用。调用格式为[类的实例方法名] 

例:Person *xiaoMing=[[Person alloc] init];//实例化

[xiaoMing setName:@”90worker”];

 

注意:

-(BOOL)likeFood:(NSString *)food;

方法名为likeFood:    【注意有个冒号】

-(id) initWithcName:(NSString *)name  andAge:(int) age;

方法名为initWithcName: andAge:   【注意有多个冒号】

 

 

 

2.3选择器@select

每一个Objective C方法都对应一个选择器,即SEL类型的对象。

Objective C运行时通过方法对应的选择来定位其实现代码。可以通过@select指令,传入方法名,可以获取该方法的选择器

用法 :  SELinitMethodSelect=@select(initWithName:age:);

用途:通常用于指定回调方法。

 

2.4属性@property

语法:@property (属性的附加特性) 类型名称;.m文件实现用@synthesize关键字。【@synthesize 属性名称|@synthesize 属性名称=成员变量名称】

 

声明:@property (nonatomic,copy) NSString *name;

实现:@synthesize name;

属性的附加特性:

 

关键词

描述

nonatomic

线程安全的,编译器默认会生成额外的代码以保证访问属性的线程安全,会牺牲一定的性能。

readonly

属性只可读,@synthesize指令只会生成get方法还没有set方法

readwrite

默认值。可读写

geter=get方法名,

setter=set方法名

当声明一个属性用@synthesize指令会生成相应的get方法和set方法,但可以通过getter和setter来手动指定get方法和set方法

assign、retain、copy

 

 

 

 

调用:对过点.来实现调用

xiaoMing.name=@”90worker”;

 

点语法oc2.0以后

为什么设计点语法

1、为了方便别的程序员转到OC开发来

2、为了让程序设计简单化

3、隐藏了内存管理细节

4、隐藏了多线程、同步、加锁细节

 

 

2.5@class关键字

@class为前向声明

现有两个类的声明

Wheel代表着轮子,Bike代表着自行车,我们知道Bike是需要Wheel的

于是有以下的代码

Bike.h

@intefrace Bike:NSObject{
       Wheel* _frontWheel, *_rearWheel;
 
}
@end


在这里我们用到了Wheel类,那么我们到底是用#import还是用@class呢?我们用一个表格来说明#import和@class

关键字

描述

#import

将Wheel类的外部接口Wheel.h整个导入,这样会产生编译依赖和编译时间的浪费。如果Bike.h中导入了Wheel.h而Bike.h文件又被很多其他的类导入 了,那么这些类也会导入了Wheel.h,一旦Wheel.h修改了,所有导入了Wheel.h的文件都发生了变化需要重新编译。

@class

1、可以有效的解除上面所说的编译依赖。如果Wheel.h修改了,对于那些导入了Bike.h的文件并没有发生变化所以也不需要重新编译。使用了@class关键字只是在类的定义中前身引用了,但在Bike类的内部实现中还是需要导入Wheel.h的,因为可能需要使用到Wheel.h中的某些定义方法

2、可以解决循环引用

 

 

 

 

 

 

2.6self关键字

 

self表示当前引用对象

记住以下两句话:

1、谁在执行该函数 self就表示谁

2、super表示该对象的父对象

 

+(int)maxAge{
       //
       在+类方法 (静方法) self表示本类【抽象】  对象是具体的、实例的
}


 

+(id) person{
       idobj=[[self alloc] init]; 
//用法==[[Person alloc]init];   == [[[self class ] alloc] init]
       //self=Person
       returnobj;
}
 
//调用  [xxx 方法名]  maxAge方法里面的self表示
int maxAge=[Person maxAge];


 

 

2.7dealloc函数

 

dealloc【只调用一次】

       对象从内存中销毁前夕调用的函数

在对象完全消失的时候调用  对象的计数器为0的时候会自动调用dealloc  不能人为的去调用此方法。应用这样调用:[xxrelease]   //release计数器1减到0 系统就会自动的调用dealloc

-(void)dealloc{
       //在调用父类之前做一些处理
       [superdealloc];
}

 

 

2.8 initialize函数

 

+(void)initialize  NSObject 这个类的第一次实例化的时候调用第一次调用alloc 或者调用init的时候就会调用  【只调用一次】  类方法在该类第一次实例化的时候调用 并且只调用一次  在这里做一些static变量的初始化操作

 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值