黑马程序员-iOS基础-Objective-C基础(四)OC开发技巧及核心语法(上)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 黑马程序员-iOS基础-Objective-C基础(四)

OC开发技巧及核心语法(上)

 一、开发技巧

1、NSString

OC字符串也是一个对象,继承自NSString类

如:

NSString *_name;
@"daflkg;gagr"


创建NSString字符串的方法

//NSString字符串的第一种创建方式
NSString *str=@"itcast";
//创建OC字符串的第二种方式(带参数)
int age=10;
int no=5;
NSString *name="jack";
NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d,name is %@", age, no, name];

创建字符串不需要调用new方法

字符串长度方法:[字符串对象名 length];

NSString字符串占位符:%@(OC对象的占位符)

2、类的练习总结

只有利用类名调用类方法的时候,不需要在类名后面写*,其他情况下,类名后面统一加一个*

返回值是BOOL类型的方法,方法名一般以is开头

要拥有某个对象,就先创建对象,然后调用set方法将对象传递给内部的成员变量

#import <Foundation/Foundation.h>
#import <math.h>
/*
设计一个类Point2D,用来表示二维平面中某个点
1> 属性
* double _x
* double _y

2> 方法
* 属性相应的set和get方法
* 设计一个对象方法同时设置x和y
* 设计一个对象方法计算跟其他点的距离
* 设计一个类方法计算两个点之间的距离

3> 提示
* C语言的math.h中有个函数:double pow(double n, double m); 计算n的m次方
* C语言的math.h中有个函数:double sqrt(double n); 计算根号n的值(对n进行开根)
*/
@interface Point2D : NSObject
{
	double _x;
	double _y;
}
//_x的set和get方法
- (void)setX:(double)x;
- (double)x;

//_y的set和get方法
- (void)setY:(double)y;
- (double)y;

//同时设置x和y
- (void)setX:(double)x AndY:(double)y;

//计算跟其他点的距离
- (double)distanceToPoint:(Point2D)point;

//计算两个点之间的距离
+ (double)distanceFromA:(Point2D)pointA ToB:(Point2D)pointB;
@end

@implementation Point2D
//_x的set和get方法
- (void)setX:(double)x
{
	_x = x;
}
- (double)x
{
	return _x;
}

//_y的set和get方法
- (void)setY:(double)y
{
	_y = y;
}
- (double)y
{
	return _y;
}

//同时设置x和y
- (void)setX:(double)x AndY:(double)y;
{
	_x = x;//1.self->_x=x;  2.[self setX:x];
	_y = y;//1.self->_y=y;  2.[self setY:y];
}

//计算跟其他点的距离
- (double)distanceToPoint:(Point2D *)point;
{
	return [Point2D distanceFromA:self ToB:point];//作用类似,可以以self进行重用
}

//计算两个点之间的距离
+ (double)distanceFromA:(Point2D *)pointA ToB:(Point2D *)pointB;
{
	return sqrt(pow(([pointA x]-[pointB x]),2)+pow(([pointA y]-[pointB y]),2));
	//return [pointA distanceToPoint:pointB];
}
@end

/*
设计一个类Circle,用来表示二维平面中的圆
1> 属性
* double _radius (半径)
* Point2D *_point (圆心)

2> 方法
* 属性相应的set和get方法
* 设计一个对象判断跟其他圆是否重叠(重叠返回YES,否则返回NO)
* 设计一个类方法判断两个圆是否重叠(重叠返回YES,否则返回NO)
*/

//圆
@interface Circle : NSObject
{
	double _radius; // 半径
	Point2D *_point;
}
//半径的set和get方法
- (void)setRadius:(double)radius;
- (double)radius;

//圆心的set和get方法
- (void)setPoint:(Point2D *)point;
- (Point2D *)point;

//判断跟其他圆是否重叠(重叠返回YES,否则返回NO)
//返回值是BOOL类型的,方法名一般用is开头
- (BOOL)isCovered:(Circle *)other;

//判断两个圆是否重叠(重叠返回YES,否则返回NO)
+ (BOOL)isCoveredBetweenCircleA:(Circle *)CircleA AndB:(Circle *)CircleB;
@end

@implementation Circle
//半径的set和get方法
- (void)setRadius:(double)radius
{
	_radius = radius;
}
- (double)radius
{
	return _radius;
}
//圆心的set和get方法
- (void)setPoint:(Point2D *)point
{
	_point = point;
}
- (Point2D *)point
{
	return _point;
}

//判断跟其他圆是否重叠(重叠返回YES,否则返回NO)
//返回值是BOOL类型的,方法名一般用is开头
- (BOOL)isCovered:(Circle *)other
{
	return [Circle isCoveredBetweenCircleA:self AndB:other];
}

//判断两个圆是否重叠(重叠返回YES,否则返回NO)
+ (BOOL)isCoveredBetweenCircleA:(Circle *)CircleA AndB:(Circle *)CircleB;
{
	Point2D *pa = [CircleA point];
	Point2D *pb = [CircleB point];
	double distance1 = [Point2D distanceFromA:pa ToB:pb];
	double distance2 = [CircleA radius] + [CircleB radius];
	
	return distance1 < distance2;
}
@end

int main(int argc, char const *argv[])
{
	Circle *c1 = [Circle new];
	Point2D *p1 = [Point2D new];
	[p1 setX:10 AndY:15];
	[c1 setPoint:p1];
	[c1 setRadius:3];

	Circle *c2 = [Circle new];
	Point2D *p2 = [Point2D new];
	[p2 setX:13 AndY:11];
	[c2 setPoint:p2];
	[c2 setRadius:1];

	BOOL result = [Circle isCoveredBetweenCircleA:c1 AndB:c2];
	NSLog(@"%d", result);

	return 0;
}


 

3、类的独立抽取

作用:1.使代码整洁,便于管理;2.便于协同开发。

定义一个类分两个文件

 .h声明文件: 成员变量、方法的声明

 .m实现文件:方法的实现

如果想使用一个类,只需要#import类的.h文件即可

因此:上一节练习全部代码可以拆分成以下五部分代码

Point2D.h

#import <Foundation/Foundation.h>
/*
设计一个类Point2D,用来表示二维平面中某个点
1> 属性
* double _x
* double _y

2> 方法
* 属性相应的set和get方法
* 设计一个对象方法同时设置x和y
* 设计一个对象方法计算跟其他点的距离
* 设计一个类方法计算两个点之间的距离

3> 提示
* C语言的math.h中有个函数:double pow(double n, double m); 计算n的m次方
* C语言的math.h中有个函数:double sqrt(double n); 计算根号n的值(对n进行开根)
*/

@interface Point2D : NSObject
{
	double _x;
	double _y;
}
//_x的set和get方法
- (void)setX:(double)x;
- (double)x;

//_y的set和get方法
- (void)setY:(double)y;
- (double)y;

//同时设置x和y
- (void)setX:(double)x AndY:(double)y;

//计算跟其他点的距离
- (double)distanceToPoint:(Point2D)point;

//计算两个点之间的距离
+ (double)distanceFromA:(Point2D)pointA ToB:(Point2D)pointB;

@end


 Point2D.m

#import "Point2D.h"
#import <math.h>


@implementation Point2D
//_x的set和get方法
- (void)setX:(double)x
{
	_x = x;
}
- (double)x
{
	return _x;
}

//_y的set和get方法
- (void)setY:(double)y
{
	_y = y;
}
- (double)y
{
	return _y;
}

//同时设置x和y
- (void)setX:(double)x AndY:(double)y;
{
	_x = x;//1.self->_x=x;  2.[self setX:x];
	_y = y;//1.self->_y=y;  2.[self setY:y];
}

//计算跟其他点的距离
- (double)distanceToPoint:(Point2D *)point;
{
	return [Point2D distanceFromA:self ToB:point];//作用类似,可以以self进行重用
}

//计算两个点之间的距离
+ (double)distanceFromA:(Point2D *)pointA ToB:(Point2D *)pointB;
{
	return sqrt(pow(([pointA x]-[pointB x]),2)+pow(([pointA y]-[pointB y]),2));
	//return [pointA distanceToPoint:pointB];

}
@end


Circle.h

#import <Foundation/Foundation.h>
#import "Point2D.h"

/*
设计一个类Circle,用来表示二维平面中的圆
1> 属性
* double _radius (半径)
* Point2D *_point (圆心)

2> 方法
* 属性相应的set和get方法
* 设计一个对象判断跟其他圆是否重叠(重叠返回YES,否则返回NO)
* 设计一个类方法判断两个圆是否重叠(重叠返回YES,否则返回NO)
*/

//圆
@interface Circle : NSObject
{
	double _radius; // 半径
	Point2D *_point;
}
//半径的set和get方法
- (void)setRadius:(double)radius;
- (double)radius;

//圆心的set和get方法
- (void)setPoint:(Point2D *)point;
- (Point2D *)point;

//判断跟其他圆是否重叠(重叠返回YES,否则返回NO)
//返回值是BOOL类型的,方法名一般用is开头
- (BOOL)isCovered:(Circle *)other;

//判断两个圆是否重叠(重叠返回YES,否则返回NO)
+ (BOOL)isCoveredBetweenCircleA:(Circle *)CircleA AndB:(Circle *)CircleB;

@end


Circle.m

#import "Circle.h"

@implementation Circle
//半径的set和get方法
- (void)setRadius:(double)radius
{
	_radius = radius;
}
- (double)radius
{
	return _radius;
}
//圆心的set和get方法
- (void)setPoint:(Point2D *)point
{
	_point = point;
}
- (Point2D *)point
{
	return _point;
}

//判断跟其他圆是否重叠(重叠返回YES,否则返回NO)
//返回值是BOOL类型的,方法名一般用is开头
- (BOOL)isCovered:(Circle *)other
{
	return [Circle isCoveredBetweenCircleA:self AndB:other];
}

//判断两个圆是否重叠(重叠返回YES,否则返回NO)
+ (BOOL)isCoveredBetweenCircleA:(Circle *)CircleA AndB:(Circle *)CircleB;
{
	Point2D *pa = [CircleA point];
	Point2D *pb = [CircleB point];
	double distance1 = [Point2D distanceFromA:pa ToB:pb];
	double distance2 = [CircleA radius] + [CircleB radius];
	
	return distance1 < distance2;
	/*
	if(distance1 >= distance2)
	{
		return NO;
	}else
	{
		return YES;
	}
	*/
}
@end


 main.m

#import "Point2D.h"
#import "Circle.h"

int main(int argc, char const *argv[])
{
	Circle *c1 = [Circle new];
	Point2D *p1 = [Point2D new];
	[p1 setX:10 AndY:15];
	[c1 setPoint:p1];
	[c1 setRadius:3];

	Circle *c2 = [Circle new];
	Point2D *p2 = [Point2D new];
	[p2 setX:13 AndY:11];
	[c2 setPoint:p2];
	[c2 setRadius:1];

	BOOL result = [Circle isCoveredBetweenCircleA:c1 AndB:c2];
	NSLog(@"%d", result);

	return 0;
}


 

 二、核心语法

1、点语法

点语法也是基于类,本质还是方法调用,编译器会自动把点语法展开

注意: set/get方法里不能写self.age,会引发死循环

举例:

<span style="font-size:12px;">#import <Foundation/Foundation.h>

@interface Person : NSObject
{
	int _age;
}

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

@end

@implementation Person

- (void)setAge:(int)age
{
	_age = age;
}
- (int)age
{
	return _age;
}

@end

int main(int argc, char const *argv[])
{
	Person *p = [Person new];
	p.age=10;//点语法,编译器会自动把点语法展开成[p setAge:10];
	int a = p.age;// [p age];

	return 0;
}</span>


2、成员变量的作用域

类型

@private

只能在当前类的对象方法中直接访问
在@implementation中声明的成员变量是@private的
但是不能和@interface中的名称一样

@protected(默认)

能在当前类和子类的对象方法中直接访问
什么都不写的时候默认是@protected

@public

在任何地方都可以直接访问对象的成员变量

@package

两个类处于同一框架中就能直接访问对象的成员变量
介于@private和@public之间

@interface和@implementation中不能声明同名的成员变量

没有@interface,只有@implementation也可以开发一个类,但不建议只写@implementation

3、术语

superclass:父类、超类

subclass:子类

4、单继承

OC是单继承语言,只能继承自一个父类

5、@property

 用在@interface中

 自动生成setter和getter的声明

//用@property int age;可以代替下面两行
//可以自动生成某个成员变量的setter和getter声明
- (void)setAge:(int)age;
- (int)age;

 

 从Xcode4.4之后@property int age;可以同时做三件事:

  1.声明age的setter和getter
  2.实现age的setter和getter
  3.自动生成private的_age成员变量

6、@synthesize

用在@implementation中

自动生成setter和getter的实现

/*
用@synthesize age = _age;可代替以下内容
自动在.h文件中找age的property,实现其setter和getter,并且访问_age这个成员变量
*/
- (void)setAge:(int)age
{
	_age = age;
}
- (int)age
{
	return _age;
}
/*
如果没有声明_age这个成员变量,会自动生成@private类型的_age变量
如果是@synthesize age,将默认访问名为age的成员变量
如果没有age,就会自动生成@private类型的age变量
*/


7、使用注意

 如果已经手动实现了setter和getter,则不会自动生成_开头的成员变量

 哪个方法手动实现了,就不会再自动实现

 只有自动实现getter或setter,才会自动生成不存在的成员变量

8、id类型

 万能指针,可以操作任何OC对象,不用加*

 id == NSObject *

 用id做参数时可以传入任意的OC类型对象

 

【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 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、付费专栏及课程。

余额充值