------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
#import
/*
设计一个类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;
}
作用:1.使代码整洁,便于管理;2.便于协同开发。
定义一个类分两个文件
.h声明文件: 成员变量、方法的声明
.m实现文件:方法的实现
如果想使用一个类,只需要#import类的.h文件即可
因此:上一节练习全部代码可以拆分成以下五部分代码
Point2D.h
#import
/*
设计一个类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
@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
#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,会引发死循环
举例:
#import
@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;
}
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类型对象