标签:
@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数
1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
2) 命名规范:
? 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
? 形参名称不能跟成员变量同名
? 返回值一定是void
1) 作用:返回对象内部的成员变量
2) 命名规范:
a) 肯定有返回值,返回值类型肯定与成员变量类型一致
b) 方法名跟变量名一样
c) 不需要任何参数
? 成员变量都以下划线 _ 开头
? 可以跟get方法的名称区分开
? 可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
#import <Foundation/Foundation.h> // 声明 @interface Car : NSObject { int _wheels; // 轮子个数 } /*set方法*/ - (void) setWheels:(int)wheels; /*get方法*/ - (int) wheels; @end @implementation Car // set方法的实现 - (void) setWheels:(int)wheels { // 对外面传进来的轮子数进行过滤 if (wheels<=0) { wheels = 1; } _wheels = wheels; } // get方法的实现 - (int) wheels { return _wheels; } @end
? 过滤不合理的值
? 屏蔽内部的赋值过程
? 让外界不必关注内部的细节
/* 4.设计一个成绩类 1> 属性 * C语言成绩 (可读可写) * OC成绩 (可读可写) * 总分 (只读) * 平均分 (只读) */ #import <Foundation/Foundation.h> @interface Score : NSObject { int _CScore;//C语言成绩 int _OcScore;//OC成绩 int _TotalScore;//总分 int _AverageScore;//平均分 } - (void)setCScore:(int)CScore; - (int)CScore; - (void)setOcScore:(int)OcScore; - (int)OcScore; - (int)TotalScore; - (int)Average; @end @implementation Score - (void)setCScore:(int)CScore { _CScore = CScore; //计算成绩 _TotalScore = _CScore + _OcScore; _AverageScore = _TotalScore/2; } - (int)CScore { return _CScore; } - (void)setOcScore:(int)OcScore { _OcScore = OcScore; //计算成绩 _TotalScore = _CScore + _OcScore; _AverageScore = _TotalScore/2; } - (int)OcScore { return _OcScore; } - (int)TotalScore { return _TotalScore; } - (int)Average { return _AverageScore; } @end int main() { Score *s = [Score new]; [s setCScore:50]; [s setOcScore:80]; NSLog(@"%d----%d",[s TotalScore],[s Average]); return 0; }
//弱语法1
#import <Foundation/Foundation.h> @interface Person : NSObject @end @implementation Person @end int main() { Person *p = [Person new]; // OC是在运行过程中才会检测对象有没有实现相应的方法 [p test]; //编译连接 不报错误,运行时报错 //unrecognized selector sent to instance 不能识别消息发送给那个对象 return 0; }
//弱语法2
#import <Foundation/Foundation.h> @interface Person : NSObject @end @implementation Person - (void) test { NSLog(@"哈哈哈"); } @end int main() { Person *p = [Person new]; // OC是在运行过程中才会检测对象有没有实现相应的方法 [p test]; //编译连接 不报错误,运行时报错 //unrecognized selector sent to instance 不能识别消息发送给那个对象 return 0; }
//弱语法3
#import <Foundation/Foundation.h> //@interface Person : NSObject // //@end @implementation Person : NSObject - (void) test { NSLog(@"哈哈哈"); } @end int main() { Person *p = [Person new]; // OC是在运行过程中才会检测对象有没有实现相应的方法 [p test]; //编译连接 不报错误,运行时报错 //unrecognized selector sent to instance 不能识别消息发送给那个对象 return 0; }
直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
1) 对象方法
? 以减号-开头
? 只能让对象调用,没有对象,这个方法根本不可能被执行
? 对象方法能访问实例变量(成员变量)
2) 类方法
? 以加号+开头
? 只能用类名调用,对象不能调用
? 类方法中不能访问实例变量(成员变量)
? 使用场合:当不需要访问成员变量的时候,尽量用类方法
3) 类方法和对象方法可以同名
#import <Foundation/Foundation.h> @interface Person : NSObject //方法以+开头 + (void)printClassName; - (void)text; @end @implementation Person + (void)printClassName { NSLog(@"这个类叫做Person"); } - (void)text { NSLog(@"调用了text方法"); } @end int main() { //找不到方法 //[Person text]; // Person *p = [Person new]; /* -[Person printClassName]: unrecognized selector sent to instance 0x7fa692f001e0‘ */ // 系统会认为现在调用的printClassName是一个对象方法 //[p printClassName]; return 0; }
/* 设计一个计算器类 * 求和 * 求平均值 */ 第一种方法 #import <Foundation/Foundation.h> @interface JiSuanQi : NSObject - (int)sumOfNum1:(int)num1 andNum2:(int)num2; - (int)averageOfNum1:(int)num1 andNum2:(int)num2; @end @implementation JiSuanQi - (int)sumOfNum1:(int)num1 andNum2:(int)num2 { return num1 + num2; } - (int)averageOfNum1:(int)num1 andNum2:(int)num2 { return (mun1 + num2) / 2; } @end int mian() { JiSuanQi *jsq = [JiSuanQi new]; [jsq sumOfNum1:10 andNum2:13] return 0; }
每一次使用计算器类都要创建一个计算器对象
第二种方法 (代码优化)
/* 设计一个计算器类 * 求和 * 求平均值 */ #import <Foundation/Foundation.h> //工具类:基本没有任何成员变量,里面的方法基本都是类方法 @interface JiSuanQi : NSObject + (int)sumOfNum1:(int)num1 andNum2:(int)num2; + (int)averageOfNum1:(int)num1 andNum2:(int)num2; @end @implementation JiSuanQi + (int)sumOfNum1:(int)num1 andNum2:(int)num2 { return num1 + num2; } + (int)averageOfNum1:(int)num1 andNum2:(int)num2 { return (mun1 + num2) / 2; } @end int mian() { //JiSuanQi *jsq = [JiSuanQi new]; [JiSuanQi sumOfNum1:10 andNum2:13] return 0; }
第三种方法 (代码优化)
/* 设计一个计算器类 * 求和 * 求平均值 */ #import <Foundation/Foundation.h> //工具类:基本没有任何成员变量,里面的方法基本都是类方法 @interface JiSuanQi : NSObject + (int)sumOfNum1:(int)num1 andNum2:(int)num2; + (int)averageOfNum1:(int)num1 andNum2:(int)num2; @end @implementation JiSuanQi + (int)sumOfNum1:(int)num1 andNum2:(int)num2 { return num1 + num2; } + (int)averageOfNum1:(int)num1 andNum2:(int)num2 { return [JiSuanQi sumOfNum1:num1 andNum2:num2] / 2; } @end int mian() { //JiSuanQi *jsq = [JiSuanQi new]; [JiSuanQi sumOfNum1:10 andNum2:13] return 0; }
? 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
? 用self访问成员变量,区分同名的局部变量
1) 出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
2) 作用
? 概念:指向了当前对象(方法调用者)
? 使用 "self->成员变量名" 访问当前方法调用的成员变量
? 使用 "[self 方法名];" 来调用方法(对象方法\类方法)
? 低级错误:用self去调用函数
? 类方法中用self调用对象方法,对象方法中用self调用类方法
? self死循环
#import <Foundation/Foundation.h> @interface Person :NSObject { int _age; } - (void)setAge:(int)age; - (int)age; - (void)test; @end @implementation Person - (void)setAge:(int)age { _age = age; } - (int)age { return _age; } - (void)test { //self : 指向了方法调用者,代表着当前对象 int _age = 20; NSLog(@"Person的年龄的%d岁",self->_age); } @end int main() { Person *p = [Person new]; [p setAge:10]; [p test]; return 0; }
#import <Foundation/Foundation.h> @interface Dog :NSObject - (void)bark; - (void)run; @end @implementation Dog - (void)bark { NSLog(@"汪汪汪"); } - (void)run { [self bark]; NSLog(@"跑跑跑"); } @end int main() { Dog *d = [Dog new]; [d run]; return 0; }
/* 设计一个计算器类 * 求和 * 求平均值 */ #import <Foundation/Foundation.h> //工具类:基本没有任何成员变量,里面的方法基本都是类方法 @interface JiSuanQi : NSObject + (int)sumOfNum1:(int)num1 andNum2:(int)num2; + (int)averageOfNum1:(int)num1 andNum2:(int)num2; @end @implementation JiSuanQi + (int)sumOfNum1:(int)num1 andNum2:(int)num2 { return num1 + num2; } + (int)averageOfNum1:(int)num1 andNum2:(int)num2 { //在这种情况下 self代表类 return [self sumOfNum1:num1 andNum2:num2] / 2; } @end int mian() { //JiSuanQi *jsq = [JiSuanQi new]; [JiSuanQi sumOfNum1:10 andNum2:13] return 0; }
注意点一
#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test; @end @implementation Person - (void)test { NSLog(@"调用了test方法"); [self test]; //会应发死循环 } @end int main () { Person *p = [Person new]; [p text]; return 0; } #import <Foundation/Foundation.h> @interface Person : NSObject - (void)test; + (void)test; @end @implementation Person - (void)test { NSLog(@"调用了test - 方法"); //[self test]; //会应发死循环 } + (void)test { NSLog(@"调用了test + 方法"); [self test];//会应发死循环 } @end int main () { [Person test]; // Person *p = [Person new]; // [p text]; return 0; }
注意点二
#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test; + (void)test; - (void)test1; + (void)test2; @end @implementation Person - (void)test { NSLog(@"调用了test - 方法"); //[self test]; //会应发死循环 } + (void)test { NSLog(@"调用了test + 方法"); //[self test];//会应发死循环 } - (void)test1 { [self test];//-text } + (void)test2 { [self test];// + text } @end int main () { //[Person test]; Person *p = [Person new]; [p text1]; return 0; }
输出结果
2015-05-19 15:22:46.304 a.out[1225:2200685] 调用了test - 方法
#import <Foundation/Foundation.h> @interface Person : NSObject - (void)test; + (void)test; - (void)test1; + (void)test2; @end @implementation Person - (void)test { NSLog(@"调用了test - 方法"); //[self test]; //会应发死循环 } + (void)test { NSLog(@"调用了test + 方法"); //[self test];//会应发死循环 } - (void)test1 { [self test]; } + (void)test2 { [self test]; } @end int main() { [Person test2]; //Person *p = [Person new]; //[p test1]; return 0; }
输出结果
2015-05-19 15:24:49.124 a.out[1229:2215202] 调用了test + 方法
标签:
原文地址:http://www.cnblogs.com/sundaboke/p/4515001.html