黑马程序员-OC学习笔记-点方法、成员变量作用域以及set方法和get方法@property的综合题
2015-06-04 22:39
846 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1. OC创建对象的拓展:
Fraction * myFraction = [[Fraction alloc] init] ;
获得对象的实例并且初始化了其实例变量(可以这样理解:将 alloc 消息发送给 Fraction 类请求创建一个新实例,然后向新创建的实例对象发送 init 消息来初始化该对象)。
另外一种方法:Fraction * myFraction = [Fraction new];
开始一直都使用该方法,在开发中,实际使用第一种方法比较多。
对象调用方法 [myFraction setNumerator :1];用完释放 Fraction 对象的方法: [myFraction release];
注:创建一个新对象,都要请求分配内存,在完成对该对象的操作时,必须释放其所用的内存空间
2.点语法:点语法的本质还是方法的调用。当使用点语法时,编译器会自动展开成相应的方法
例:
Int main(int argc,const char *argv[])
{
Person *p = [Personnew];
p.age=10; // 相当于[p setAge:10]
intc = p.age; // 相当于[p getAge]
}
点方法用图表示如下:
//注意的是:在使用点方法的时候需要先有set方法和get方法的声明和实现,否则不能用;还有就是在方法的实现里面使用点方法需要注意,不要形成死循环。
例:下面的两个方法在调用点方法会造成死循环。
- (void) setAge:(int)age
{
self.age = age; // 这段代码会引发死循环
}
- (int) age
{
return self.age; // 这段代码会引发死循环
}
区别:java的点方法是直接访问成员变量,而OC中编译器遇到点方法就自动转成set方法和get方法。OC的点方法主要是让程序能被其它语言开发者看懂。
3. OC成员变量的作用域
1> 基本概念
局部变量、全局变量都有自己的作用域,成员变量也不例外
2> 类型
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
3> 继承的补充
专业术语:
父类\超类 superclass
子类 subclass\subclasses
OC的继承都是单继承,只有一个父类
4> @implementation补充
在代码中,即使没有@interface,只有@implementation,也可以开发一个类。而且类里面还可以有成员变量,成员变量的作用域和有@interface声明的一样。但是需要注意的是,如果@interface声明里面有成员变量,而同一类的implementation中再声明成员变量,那么implementation的变量类型只是能@private的,而且不能和声明的成员变量同名。。4. OC字符串学习
int main()
{
NSString*newStr = [NSString stringWithFormat:@"My age is %d and no is%d",age,no];// OC的字符串很强大,在
字符串里面还可以打印多个参数。
NSLog(@"--%@",newStr);
[newStrlength];//算字符串的方法,但是跟C有区别,length算的是字数,不是字符数。
strlen(newStr);//算的是字符,如果newStr 有中文,占3个字符,算出的结果就不一样。
return0;
}
/*
题目:设计一个类Circle,用来表示二维平面中的圆
思路分析:如何才能用程序来设计一个二维平面圆呢?我们知道,圆是由半径绕着圆心而围成的,也就是说,想要画一个圆,需要知道圆心还有就是半径。圆心在二维空间就是(x,y).半径可以设计另外一个点,计算点到点的距离就可以了。下面就是先设计一个点,再一步步实现圆的。
1.先设计一个类Point2D,用来表示二维平面中某个点
1> 属性
* double x
* double y
2> 方法
* 属性相应的set和get方法
* 设计一
4000
个对象方法同时设置x和y
* 设计一个对象方法计算跟其他点的距离
* 设计一个类方法计算两个点之间的距离
3> 提示
* C语言的math.h中有个函数:doublepow(double n, double m); 计算n的m次方
* C语言的math.h中有个函数:doublesqrt(double n); 计算根号n的值(对n进行开根)
2.再设计一个Circle类表示二维平面圆
1> 属性
* doubleradius (半径)
* Point2D*point (圆心)
2> 方法
* 属性相应的set和get方法
* 设计一个对象方法判断跟其他圆是否相交(重叠返回YES,否则返回NO)
* 设计一个类方法判断两个圆是否相交(重叠返回YES,否则返回NO)
*/
<pre name="code" class="html">#import <Foundation/Foundation.h>
#include "Circle.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建一个圆对象,点方法设置圆的半径
Circle *c1 = [[Circle alloc] init];
c1.radius = 3;
Circle *c2 = [[Circle alloc] init];
c2.radius = 5;
// 创建一个点的对象,setter 方法设置两点
Point2D *p1 = [[Point2D alloc] init];
[p1 setX:0 andY:0];
Point2D *p2 = [[Point2D alloc] init];
[p2 setX:3 andY:4];
// 设置圆心
[c1 setPoint:p1];
[c2 setPoint:p2];
// 分别使用对象方法和类方法比较输出圆是否重叠,重叠输出1,不重叠输出0
BOOL result1 = [c1 compareCircleWithOther:c2];
BOOL result2 = [Circle compareWithCircle1:c1 andCircle2:c2];
NSLog(@"对象方法计算的结果=%d,类方法计算的结果=%d",result1,result2);
}
return 0;
}
//
// Circle.m
// 06-作业圆与圆之间的距离
//
// Created by 黄焕恩 on 16/1/1.
// Copyright © 2016年 黄焕恩. All rights reserved.
//
#import "Circle.h"
@implementation Circle
- (void)setPoint: (Point2D *)point // 设置圆心
{
_point2d = point ;
}
- (Point2D *)point
{
return _point2d;
}
- (BOOL)compareCircleWithOther: (Circle *)other
{
return [ Circle compareWithCircle1:self andCircle2:other];
}
+ (BOOL)compareWithCircle1: (Circle *)circle1 andCircle2: (Circle *) circle2
{
// 计算的是圆心的距离,这里需要注意
double distanceXY = [self comparePointWithNum1:circle1->_point2d andNum2:circle2->_point2d];
double radiusXY = circle1.radius + circle2.radius;
return distanceXY < radiusXY;
}
@end
//
// Point2D.h
// 05-计算两点之间的距离
//
// Created by 黄焕恩 on 16/1/1.
// Copyright © 2016年 黄焕恩. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Point2D : NSObject
@property double x; // 自动生成_x的setter 和 getter
@property double y; // 自动生成_y的 setter 和 getter
- (void)setX: (double)x andY: (double)y;
// 同时设置_x
- (double)comparePointWithOther: (Point2D *)other;
+ (double)comparePointWithNum1: (Point2D *)num1 andNum2: (Point2D *)num2;
@end
总结:这道题综合性挺强,主要用到的知识就是类的组合方法,set方法和get方法,@property关键字以及对象方法和类方法。在算法上,涉及到数学的平方公式函数pow()和开平方公式sqrt();在程序中,加入了self关键字的使用,使得看似不一样的方法,可以合并成同一样的方法,减少了代码使用的重复性。难点主要是类中的属性又是一个类,在涉及类的set方法时候就要注意了,传递的参数是(类名 *)参数。另外还需要注意的是,任何一个类,除了类方法的调用不需要创建新的对象外,其它需要用到对象的,都必须先创建一个新对象,然后再调用方法。
最后需要注意的是格式要求,这段代码的写法比较规范,可读性强,看起来比较舒服。
1. OC创建对象的拓展:
Fraction * myFraction = [[Fraction alloc] init] ;
获得对象的实例并且初始化了其实例变量(可以这样理解:将 alloc 消息发送给 Fraction 类请求创建一个新实例,然后向新创建的实例对象发送 init 消息来初始化该对象)。
另外一种方法:Fraction * myFraction = [Fraction new];
开始一直都使用该方法,在开发中,实际使用第一种方法比较多。
对象调用方法 [myFraction setNumerator :1];用完释放 Fraction 对象的方法: [myFraction release];
注:创建一个新对象,都要请求分配内存,在完成对该对象的操作时,必须释放其所用的内存空间
2.点语法:点语法的本质还是方法的调用。当使用点语法时,编译器会自动展开成相应的方法
例:
Int main(int argc,const char *argv[])
{
Person *p = [Personnew];
p.age=10; // 相当于[p setAge:10]
intc = p.age; // 相当于[p getAge]
}
点方法用图表示如下:
//注意的是:在使用点方法的时候需要先有set方法和get方法的声明和实现,否则不能用;还有就是在方法的实现里面使用点方法需要注意,不要形成死循环。
例:下面的两个方法在调用点方法会造成死循环。
- (void) setAge:(int)age
{
self.age = age; // 这段代码会引发死循环
}
- (int) age
{
return self.age; // 这段代码会引发死循环
}
区别:java的点方法是直接访问成员变量,而OC中编译器遇到点方法就自动转成set方法和get方法。OC的点方法主要是让程序能被其它语言开发者看懂。
3. OC成员变量的作用域
1> 基本概念
局部变量、全局变量都有自己的作用域,成员变量也不例外
2> 类型
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
3> 继承的补充
专业术语:
父类\超类 superclass
子类 subclass\subclasses
OC的继承都是单继承,只有一个父类
4> @implementation补充
在代码中,即使没有@interface,只有@implementation,也可以开发一个类。而且类里面还可以有成员变量,成员变量的作用域和有@interface声明的一样。但是需要注意的是,如果@interface声明里面有成员变量,而同一类的implementation中再声明成员变量,那么implementation的变量类型只是能@private的,而且不能和声明的成员变量同名。。4. OC字符串学习
int main()
{
NSString*newStr = [NSString stringWithFormat:@"My age is %d and no is%d",age,no];// OC的字符串很强大,在
字符串里面还可以打印多个参数。
NSLog(@"--%@",newStr);
[newStrlength];//算字符串的方法,但是跟C有区别,length算的是字数,不是字符数。
strlen(newStr);//算的是字符,如果newStr 有中文,占3个字符,算出的结果就不一样。
return0;
}
/*
题目:设计一个类Circle,用来表示二维平面中的圆
思路分析:如何才能用程序来设计一个二维平面圆呢?我们知道,圆是由半径绕着圆心而围成的,也就是说,想要画一个圆,需要知道圆心还有就是半径。圆心在二维空间就是(x,y).半径可以设计另外一个点,计算点到点的距离就可以了。下面就是先设计一个点,再一步步实现圆的。
1.先设计一个类Point2D,用来表示二维平面中某个点
1> 属性
* double x
* double y
2> 方法
* 属性相应的set和get方法
* 设计一
4000
个对象方法同时设置x和y
* 设计一个对象方法计算跟其他点的距离
* 设计一个类方法计算两个点之间的距离
3> 提示
* C语言的math.h中有个函数:doublepow(double n, double m); 计算n的m次方
* C语言的math.h中有个函数:doublesqrt(double n); 计算根号n的值(对n进行开根)
2.再设计一个Circle类表示二维平面圆
1> 属性
* doubleradius (半径)
* Point2D*point (圆心)
2> 方法
* 属性相应的set和get方法
* 设计一个对象方法判断跟其他圆是否相交(重叠返回YES,否则返回NO)
* 设计一个类方法判断两个圆是否相交(重叠返回YES,否则返回NO)
*/
<pre name="code" class="html">#import <Foundation/Foundation.h>
#include "Circle.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建一个圆对象,点方法设置圆的半径
Circle *c1 = [[Circle alloc] init];
c1.radius = 3;
Circle *c2 = [[Circle alloc] init];
c2.radius = 5;
// 创建一个点的对象,setter 方法设置两点
Point2D *p1 = [[Point2D alloc] init];
[p1 setX:0 andY:0];
Point2D *p2 = [[Point2D alloc] init];
[p2 setX:3 andY:4];
// 设置圆心
[c1 setPoint:p1];
[c2 setPoint:p2];
// 分别使用对象方法和类方法比较输出圆是否重叠,重叠输出1,不重叠输出0
BOOL result1 = [c1 compareCircleWithOther:c2];
BOOL result2 = [Circle compareWithCircle1:c1 andCircle2:c2];
NSLog(@"对象方法计算的结果=%d,类方法计算的结果=%d",result1,result2);
}
return 0;
}
// // Circle.h // 06-作业圆与圆之间的距离 // // Created by 黄焕恩 on 16/1/1. // Copyright © 2016年 黄焕恩. All rights reserved. // /* 6.设计一个类Circle,用来表示二维平面中的圆 1> 属性 * double _radius (半径) * Point2D *_point (圆心) 2> 方法 * 属性相应的set和get方法 * 设计一个对象判断跟其他圆是否重叠(重叠返回YES,否则返回NO) * 设计一个类方法判断两个圆是否重叠(重叠返回YES,否则返回NO) */ #import <Foundation/Foundation.h> #import "Point2D.h" @interface Circle : Point2D { Point2D *_point2d; // 圆心的属性 } @property double radius; // 圆半径的setter 和 getter 方法 - (void)setPoint: (Point2D *)point; // 圆心之间的距离 setter 方法 - (Point2D *)point; // 圆心之间的getter 方法 - (BOOL)compareCircleWithOther: (Circle *)other; + (BOOL)compareWithCircle1: (Circle *)circle1 andCircle2: (Circle *)circle2; @end
//
// Circle.m
// 06-作业圆与圆之间的距离
//
// Created by 黄焕恩 on 16/1/1.
// Copyright © 2016年 黄焕恩. All rights reserved.
//
#import "Circle.h"
@implementation Circle
- (void)setPoint: (Point2D *)point // 设置圆心
{
_point2d = point ;
}
- (Point2D *)point
{
return _point2d;
}
- (BOOL)compareCircleWithOther: (Circle *)other
{
return [ Circle compareWithCircle1:self andCircle2:other];
}
+ (BOOL)compareWithCircle1: (Circle *)circle1 andCircle2: (Circle *) circle2
{
// 计算的是圆心的距离,这里需要注意
double distanceXY = [self comparePointWithNum1:circle1->_point2d andNum2:circle2->_point2d];
double radiusXY = circle1.radius + circle2.radius;
return distanceXY < radiusXY;
}
@end
//
// Point2D.h
// 05-计算两点之间的距离
//
// Created by 黄焕恩 on 16/1/1.
// Copyright © 2016年 黄焕恩. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Point2D : NSObject
@property double x; // 自动生成_x的setter 和 getter
@property double y; // 自动生成_y的 setter 和 getter
- (void)setX: (double)x andY: (double)y;
// 同时设置_x
- (double)comparePointWithOther: (Point2D *)other;
+ (double)comparePointWithNum1: (Point2D *)num1 andNum2: (Point2D *)num2;
@end
// // Point2D.m // 05-计算两点之间的距离 // // Created by 黄焕恩 on 16/1/1. // Copyright © 2016年 黄焕恩. All rights reserved. // /* 5.设计一个类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进行开根) */ #import "Point2D.h" #import "math.h" @implementation Point2D - (void)setX: (double)x andY: (double)y { self.x = x; // 使用的是点方法 self.y = y; // 使用的是点方法 // [self setX: x]; // 最原始的setter // [self setY: y]; } - (double)comparePointWithOther: (Point2D *)other // 点是个类,所以参数是类 { return ([Point2D comparePointWithNum1:self andNum2:other]); } + (double)comparePointWithNum1: (Point2D *)num1 andNum2: (Point2D *)num2 { double xdete ; double ydete; xdete = num1.x - num2.x; ydete = num1.y - num2.y; return sqrt( pow(xdete, 2) + pow(ydete, 2)); } @end
总结:这道题综合性挺强,主要用到的知识就是类的组合方法,set方法和get方法,@property关键字以及对象方法和类方法。在算法上,涉及到数学的平方公式函数pow()和开平方公式sqrt();在程序中,加入了self关键字的使用,使得看似不一样的方法,可以合并成同一样的方法,减少了代码使用的重复性。难点主要是类中的属性又是一个类,在涉及类的set方法时候就要注意了,传递的参数是(类名 *)参数。另外还需要注意的是,任何一个类,除了类方法的调用不需要创建新的对象外,其它需要用到对象的,都必须先创建一个新对象,然后再调用方法。
最后需要注意的是格式要求,这段代码的写法比较规范,可读性强,看起来比较舒服。
相关文章推荐
- JavaScript 学习笔记之变量及其作用域
- 深入理解javascript作用域和闭包
- javascript作用域和闭包使用详解
- C#中Property和Attribute的区别实例详解
- JavaScript中检查对象property的存在性方法介绍
- 深入理解Javascript作用域与变量提升
- 深入理解Javascript中this的作用域
- JavaScript中对象property的删除方法介绍
- JavaScript中遍历对象的property的3种方法介绍
- JavaScript 变量、作用域及内存
- Javascript学习笔记之函数篇(六) : 作用域与命名空间
- 浅谈javascript中的作用域
- javascript变量作用域使用中常见错误总结
- javascript 对象属性property与元素属性attribute的浏览器支持
- JSP中 Session和作用域的使用
- js变量以及其作用域详解
- javascript中的作用域和上下文使用简要概述
- Javascript学习笔记3 作用域
- JavaScript Table排序 2.0 (更新)
- JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染