黑马程序员-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类型对象

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值