OC基础语法(三)---核心语法(1)
2014-12-21 16:08
597 查看
一、点语法
格式: p.age = 10; 即 [p aetAge:10];
int a = p.age; 即 [p age];
点语法的本质还是方法调用,并不是访问成员变量。
在OC中访问成员变量,只有 p->—_age;
成员变量的作用域:
@public :在任何地方的都能直接访问对象的成员变量
@private:只能在当前类的对象方法中直接访问
@protected:只能在当前类和子类的对象方法中直接访问
@package:只要处在一个同一个框架中,就能直接访问对象的成员变量
注:写在类的.m文件中的成员变量默认就是私有(private);
写在类的.h文件中的成员变量默认是protected.
OC中:类是单继承。
二、property和 synthesize
编译器特性:
@property:可以自动生成某个成员变量的setter和getter 声明;
例: @property int age;
即: - (void)setAge:(int)age;
- (int)age;
@synthesize:自动生成成员变量的setter 和 getter 实现,并且会访问这个成员变
量;
例: @synthesize age = _age;
若是: @synthesize age;默认会访问age这个成员变量,如果没有age,就会
自动生成private age。
可以简写:(类型相同时)
@property int speed,wheels;
@synthesize speed = _speed,wheels = _wheels;
注:xCode 4.4 以后:可以支持简写:
@property int speed; //包含了方法的声明和实现,_speed成员变量的声明;
缺点:默认的成员变量是私有的,要想子类对象能访问,必须写声明: int _speed;
关于synthetic的手动实现:
1.若手动实现了setter,编译器就会自动生成getter;
2.若手动实现了getter,编译器就会自动生成setter;
3.若同时手动实现了setter和getter,编译器就不会 自动生成不存在的成员变量。
id 关键字:万能指针,能指向操作任何OC对象。
三、构造方法
定义:用来初始化对象的方法,是个对象方法,“-”开头。
例: Person *p = [Person new];
可分为两步初始化:
Person *p1 = [Person alloc];//分配存储空间
Person *p2 = [Person init];//调用 -init进行初始化
合并为:
Person *p = [[Person alloc] init];
重写构造方法的目的: 为了让对象创建出来吗,成员变量就有一些固定的值。
重写init 方法例子:
- (id)init
{ // 一定要调用回super 的 init 方法:初始化父类中声明色一些成员变
// 量和其他属性
self = [super init];
//如果对象初始化成功,才有必要进行接下来的初始化
if(self != nil)
{//初始化成功
_age = 10;
}
//返回一个已经初始化完毕的对象
return self;
}
最简洁代码:
- (id)init
{
if(self = [super init])
{
_age = 10;
}
return self;
}
重写构造方法的注意点:
1.先调用弗雷德构造方法;
2.再进行子类内部成员变量的初始化。
自定义构造方法的规范:
1.一定是对象方法,一定一“-”开头;
2.返回值一定是id 类型;
3.方法名一般以init 开头。
例如: - (id)initWithName:(NSString *)name
{
if(self = [super init])
{
_name = name;
}
return self;
}
四、分类(Gategory)
定义:可以给一个类扩充一些方法(不修改原来类的代码),不能扩充成员变量。
声明:
@interface 类名(分类名称)
@end
实现:
@implementation 类名(分类名称)
@end
作用:
1.可以给一个类扩充一些方法(不修改原来类的代码),不能扩充成员变量;
2.分类实现中可以访问原来类中声明的成员变量;
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没有再使用;
4.方法的调用优先级: 分类——>原来类——>父类。
好处:一个庞大的类可以分模块开发;
一个庞大的类可以由多人来编写,更有利于团队合作。
五、练习
比较两个圆是否重叠:
/*
设计一个类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进行开根)
4. 设计一个圆的类Circle
*/
i#import <Foundation/Foundation.h>
#import <math.h>
//点
@interface Point2D : NSobject
{
double _x; // x值
double _y; // y值
}
//设置x的setter和getter
-(void)setX:(double)x;
- (double)x;
//设置y的setter和getter
- (void)setY:(double)y;
- (double)y;
//同时设置x和y
- (void)setX:(double)x andY:(double)y;
//计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other;
//计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point *)p2;
@end
@implementation Point2D
-(void)setX:(double)x
{
_x = x;
}
- (double)x
{
return _x;
}
- (void)setY:(double)y
{
_y = y;
}
- (double)y
{
return _y;
}
//同时设置x和y
- (void)setX:(double)x andY:(double)y;
{
/*
_x = x;
_y = y;
*/
[self setX:x];
[self setY:y];
}
//计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other
{
//((x1-x2)的平方+(y1-y2)的平方)开根
double xDelta = [self x] - [other x];//_x - [other x];
double yDelta = [self y] - [other y];//_y - [other y];
double xDeltaPF = pow(xDelta, 2);
double yDeltaPF = pow(yDelta, 2);
return sqrt(xDelta + yDelta);
}
//计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point *)p2
{
return [p1 distanceWithOther:p2];
}
@end
@interface Circle : NSobject
{
double _radius; // 半径
Point *_point; // 圆心(组合)
}
//设置半径的setter和getter
- (void)setRadius:(double)radius;
- (double)radius;
//设置圆心的setter和getter
- (void)setPoint:(Point *)point;
- (void)point;
//判断跟其他圆是否重叠
//返回值是BOOL类型的,方法名一般是以is 开头
- (BOOL)isOverlappingWithOther:(Circle *)other;
+ (BOOL)isOverlappingBetweenCircle1:(Circle *)circle1 andCircle2:(Circle *)circle2;
@end
@implementation Circle
//设置半径的setter和getter
- (void)setRadius:(double)radius
{
_radius = radius;
}
- (double)radius
{
return _radius;
}
//设置圆心的setter和getter
- (void)setPoint:(Point *)point
{
_point = point;
}
- (Point *)point
{
return point;
}
//圆心之间的距离> 半径之和则不重叠返回NO
//圆心之间的距离< 半径之和则重叠 返回YES
- (BOOL)isOverlappingWithOther:(Circle *)other
{
Point *p1 = [self point];
Point *p2 = [other point];
double distance = [p1 distanceWithOther:p2;
double sumRadius = [self radius] - [other radius];
return distance < sumRadius;
}
+ (BOOL)isOverlappingBetweenCircle1:(Circle *)c1 andCircle2:(Circle *)c2
{
return [c1 isOverlappingWithOther:c2];
@end
int main()
{
/*
Point *p1 = [Point new];//创建一个新的对象p1
//设置x和y的值
[p1 setX:10 andY:15];
Point *p2 = [Point new];// 创建一个新的对象p2
//设置x和y的值
[p2 setX:13 andY:19];
//计算p1和p2之间的距离
double d = [p1 distanceWithOther:p2];
NSLog(@"%d",d);
//调用类方法,计算p1和p2之间的距离
double d2 = [Point distanceBetweenPoint1:p1 andPoint2:p2];
NSLog(@"%d",d2);
*/
//创建一个圆的对象
Circle *c1 = [Circle new];
// 设置圆的半径
[c setRadius:3];
//创建圆心的对象
Point *p1 = [Point new];
//设置x和y的值
[p1 setX:10 andY:15];
[c1 setPoint:p1];
//设置一个圆的对象c2
Circle *c2 = [Circle new];
//设置c2的半径
[c2 setRadius:5];
Point *p2 = [Point new];
[p2 setX:13 andY:19];
[c2 setPoint:p2];
BOOL b1 = [c1 isOverlappingWithOther:c2];
NSLog(@"%d"b1);
}
给NSString 分类写个类方法,输出一个字符串中数字的个数:
/*
给NSString添加一个类方法,计算字符串中数字的个数
*/
#import <Foundation/Foundation.h>
//#import <NSString+Number>,多文件开发时.m文件的头文件
@interface NSString(Number)
//方法的声明
+ (int)numberOfString:(NSString *)str;
@end
@implementation NSString(Number)
//方法的实现
+ (int)numberOfString:(NSString *)str
{
int count = 0;
for(int i = 0;i < str.length;i++)
{
//返回第i个位置的字符
unichar c= [str characterAtIndex:i];
//注意字符串是由字符构成的,单个字符要用''包住
if(c >= '0' && c <= '9')
{
count++;
}
}
return count;
}
@end
int main()
{
//NSString 类调用方法
int count = [NSString numberOfString:@"wo shi 123 wang"];
//输出数字的个数
NSLog(@"%d",count);
return 0;
}
运行结果:3
给NSString增加一个对象方法,计算当前对象里面的阿拉伯数字的个数:
/*
给NSString 添加一个对象方法,计算当前对象里面的阿拉伯数字的个数
*'/
#import <Foundation/Foundation.h>
@interface NSString
//方法的声明
- (int)numberCount;
@end
@implementation NSString
//方法的实现
- (int)numberCount
{
int count = 0;
for(int i = 0;i <self.length;i++)
{
unichar c = [self characterAtIndex:i];
if(c >= '0' && c <= '9')
{
count++;
}
}
return count;
}
@end
int main()
{
NSString *str = @"woshi123wang";
int count = [str numberCount];
NSLog(@"%d",count);
return 0;
}
运行结果:3
格式: p.age = 10; 即 [p aetAge:10];
int a = p.age; 即 [p age];
点语法的本质还是方法调用,并不是访问成员变量。
在OC中访问成员变量,只有 p->—_age;
成员变量的作用域:
@public :在任何地方的都能直接访问对象的成员变量
@private:只能在当前类的对象方法中直接访问
@protected:只能在当前类和子类的对象方法中直接访问
@package:只要处在一个同一个框架中,就能直接访问对象的成员变量
注:写在类的.m文件中的成员变量默认就是私有(private);
写在类的.h文件中的成员变量默认是protected.
OC中:类是单继承。
二、property和 synthesize
编译器特性:
@property:可以自动生成某个成员变量的setter和getter 声明;
例: @property int age;
即: - (void)setAge:(int)age;
- (int)age;
@synthesize:自动生成成员变量的setter 和 getter 实现,并且会访问这个成员变
量;
例: @synthesize age = _age;
若是: @synthesize age;默认会访问age这个成员变量,如果没有age,就会
自动生成private age。
可以简写:(类型相同时)
@property int speed,wheels;
@synthesize speed = _speed,wheels = _wheels;
注:xCode 4.4 以后:可以支持简写:
@property int speed; //包含了方法的声明和实现,_speed成员变量的声明;
缺点:默认的成员变量是私有的,要想子类对象能访问,必须写声明: int _speed;
关于synthetic的手动实现:
1.若手动实现了setter,编译器就会自动生成getter;
2.若手动实现了getter,编译器就会自动生成setter;
3.若同时手动实现了setter和getter,编译器就不会 自动生成不存在的成员变量。
id 关键字:万能指针,能指向操作任何OC对象。
三、构造方法
定义:用来初始化对象的方法,是个对象方法,“-”开头。
例: Person *p = [Person new];
可分为两步初始化:
Person *p1 = [Person alloc];//分配存储空间
Person *p2 = [Person init];//调用 -init进行初始化
合并为:
Person *p = [[Person alloc] init];
重写构造方法的目的: 为了让对象创建出来吗,成员变量就有一些固定的值。
重写init 方法例子:
- (id)init
{ // 一定要调用回super 的 init 方法:初始化父类中声明色一些成员变
// 量和其他属性
self = [super init];
//如果对象初始化成功,才有必要进行接下来的初始化
if(self != nil)
{//初始化成功
_age = 10;
}
//返回一个已经初始化完毕的对象
return self;
}
最简洁代码:
- (id)init
{
if(self = [super init])
{
_age = 10;
}
return self;
}
重写构造方法的注意点:
1.先调用弗雷德构造方法;
2.再进行子类内部成员变量的初始化。
自定义构造方法的规范:
1.一定是对象方法,一定一“-”开头;
2.返回值一定是id 类型;
3.方法名一般以init 开头。
例如: - (id)initWithName:(NSString *)name
{
if(self = [super init])
{
_name = name;
}
return self;
}
四、分类(Gategory)
定义:可以给一个类扩充一些方法(不修改原来类的代码),不能扩充成员变量。
声明:
@interface 类名(分类名称)
@end
实现:
@implementation 类名(分类名称)
@end
作用:
1.可以给一个类扩充一些方法(不修改原来类的代码),不能扩充成员变量;
2.分类实现中可以访问原来类中声明的成员变量;
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没有再使用;
4.方法的调用优先级: 分类——>原来类——>父类。
好处:一个庞大的类可以分模块开发;
一个庞大的类可以由多人来编写,更有利于团队合作。
五、练习
比较两个圆是否重叠:
/*
设计一个类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进行开根)
4. 设计一个圆的类Circle
*/
i#import <Foundation/Foundation.h>
#import <math.h>
//点
@interface Point2D : NSobject
{
double _x; // x值
double _y; // y值
}
//设置x的setter和getter
-(void)setX:(double)x;
- (double)x;
//设置y的setter和getter
- (void)setY:(double)y;
- (double)y;
//同时设置x和y
- (void)setX:(double)x andY:(double)y;
//计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other;
//计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point *)p2;
@end
@implementation Point2D
-(void)setX:(double)x
{
_x = x;
}
- (double)x
{
return _x;
}
- (void)setY:(double)y
{
_y = y;
}
- (double)y
{
return _y;
}
//同时设置x和y
- (void)setX:(double)x andY:(double)y;
{
/*
_x = x;
_y = y;
*/
[self setX:x];
[self setY:y];
}
//计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other
{
//((x1-x2)的平方+(y1-y2)的平方)开根
double xDelta = [self x] - [other x];//_x - [other x];
double yDelta = [self y] - [other y];//_y - [other y];
double xDeltaPF = pow(xDelta, 2);
double yDeltaPF = pow(yDelta, 2);
return sqrt(xDelta + yDelta);
}
//计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point *)p2
{
return [p1 distanceWithOther:p2];
}
@end
@interface Circle : NSobject
{
double _radius; // 半径
Point *_point; // 圆心(组合)
}
//设置半径的setter和getter
- (void)setRadius:(double)radius;
- (double)radius;
//设置圆心的setter和getter
- (void)setPoint:(Point *)point;
- (void)point;
//判断跟其他圆是否重叠
//返回值是BOOL类型的,方法名一般是以is 开头
- (BOOL)isOverlappingWithOther:(Circle *)other;
+ (BOOL)isOverlappingBetweenCircle1:(Circle *)circle1 andCircle2:(Circle *)circle2;
@end
@implementation Circle
//设置半径的setter和getter
- (void)setRadius:(double)radius
{
_radius = radius;
}
- (double)radius
{
return _radius;
}
//设置圆心的setter和getter
- (void)setPoint:(Point *)point
{
_point = point;
}
- (Point *)point
{
return point;
}
//圆心之间的距离> 半径之和则不重叠返回NO
//圆心之间的距离< 半径之和则重叠 返回YES
- (BOOL)isOverlappingWithOther:(Circle *)other
{
Point *p1 = [self point];
Point *p2 = [other point];
double distance = [p1 distanceWithOther:p2;
double sumRadius = [self radius] - [other radius];
return distance < sumRadius;
}
+ (BOOL)isOverlappingBetweenCircle1:(Circle *)c1 andCircle2:(Circle *)c2
{
return [c1 isOverlappingWithOther:c2];
@end
int main()
{
/*
Point *p1 = [Point new];//创建一个新的对象p1
//设置x和y的值
[p1 setX:10 andY:15];
Point *p2 = [Point new];// 创建一个新的对象p2
//设置x和y的值
[p2 setX:13 andY:19];
//计算p1和p2之间的距离
double d = [p1 distanceWithOther:p2];
NSLog(@"%d",d);
//调用类方法,计算p1和p2之间的距离
double d2 = [Point distanceBetweenPoint1:p1 andPoint2:p2];
NSLog(@"%d",d2);
*/
//创建一个圆的对象
Circle *c1 = [Circle new];
// 设置圆的半径
[c setRadius:3];
//创建圆心的对象
Point *p1 = [Point new];
//设置x和y的值
[p1 setX:10 andY:15];
[c1 setPoint:p1];
//设置一个圆的对象c2
Circle *c2 = [Circle new];
//设置c2的半径
[c2 setRadius:5];
Point *p2 = [Point new];
[p2 setX:13 andY:19];
[c2 setPoint:p2];
BOOL b1 = [c1 isOverlappingWithOther:c2];
NSLog(@"%d"b1);
}
给NSString 分类写个类方法,输出一个字符串中数字的个数:
/*
给NSString添加一个类方法,计算字符串中数字的个数
*/
#import <Foundation/Foundation.h>
//#import <NSString+Number>,多文件开发时.m文件的头文件
@interface NSString(Number)
//方法的声明
+ (int)numberOfString:(NSString *)str;
@end
@implementation NSString(Number)
//方法的实现
+ (int)numberOfString:(NSString *)str
{
int count = 0;
for(int i = 0;i < str.length;i++)
{
//返回第i个位置的字符
unichar c= [str characterAtIndex:i];
//注意字符串是由字符构成的,单个字符要用''包住
if(c >= '0' && c <= '9')
{
count++;
}
}
return count;
}
@end
int main()
{
//NSString 类调用方法
int count = [NSString numberOfString:@"wo shi 123 wang"];
//输出数字的个数
NSLog(@"%d",count);
return 0;
}
运行结果:3
给NSString增加一个对象方法,计算当前对象里面的阿拉伯数字的个数:
/*
给NSString 添加一个对象方法,计算当前对象里面的阿拉伯数字的个数
*'/
#import <Foundation/Foundation.h>
@interface NSString
//方法的声明
- (int)numberCount;
@end
@implementation NSString
//方法的实现
- (int)numberCount
{
int count = 0;
for(int i = 0;i <self.length;i++)
{
unichar c = [self characterAtIndex:i];
if(c >= '0' && c <= '9')
{
count++;
}
}
return count;
}
@end
int main()
{
NSString *str = @"woshi123wang";
int count = [str numberCount];
NSLog(@"%d",count);
return 0;
}
运行结果:3
相关文章推荐
- OC基础语法(四)---核心语法(2)
- 黑马程序员——OC基础---核心语法(点语法,成员变量的作用域,@property和@synthesize)
- 黑马程序员-iOS基础-Objective-C基础(四)OC开发技巧及核心语法(上)
- 黑马程序员—OC语言基础—核心语法小结
- 黑马程序员——OC基础—核心语法(下)
- 黑马程序员--ios基础--oc--面向对象--核心语法
- 黑马程序员——OC基础---核心语法(id,构造方法,Category,description,SEL)
- OC基础——核心语法
- 黑马程序员----OC基础--核心语法、关键字
- 黑马程序员——OC基础—核心语法(上)
- OC基础—点语法、成员变量的作用域
- 黑马程序员_OC基础06_OC语法
- OC学习笔记之OC的核心语法
- 黑马程序员_OC之核心语法
- 黑马程序员 _6 OC基础 set get语法与点语法
- Javascript语法基础 - Javascript核心(一)
- 黑马程序员-IOS-OC基础-面向对象语法一
- 黑马程序员_OC基础01_基础语法
- 黑马程序员_OC核心语法之分类
- 黑马程序员_ios基础总结9_OC特有语法