IOS学习笔记 O2
- 第二章 Objective-C语言基础进阶
一、Objective-C语言写法简化
- 利用@property快速生成setget方法
1、首先来复习一下setget写法,这是上一节笔记写的setget方法的User.h文件
1 #import <Foundation/Foundation.h> 2 3 @interface User : NSObject 4 { 5 NSString * _name; //定义字符串变量 6 NSString * _sex; 7 NSInteger _age; //定义整型变量 8 } 9 /*********setget方法*********/ 10 /**定义set用户昵称的方法*/ 11 - (void) setName:(NSString *) name; 12 /**定义get用户昵称的方法*/ 13 - (NSString *)name; 14 /**定义set性别的方法*/ 15 - (void) setSex:(NSString *) sex; 16 /**定义get性别的方法*/ 17 - (NSString *)sex; 18 /**定义set年龄的方法*/ 19 - (void) setAge:(NSInteger) age; 20 /**定义get年龄的方法*/ 21 - (NSInteger)age; 22 23 /*********其他方法*********/ 24 /**定义声明类的方法*/ 25 - (void) createMyClass; 26 @end
27
28 //虽然这种写法简单易懂,条理分明,但是看起来模式化的语言结构是不是有些繁琐呢?笔者在刚接触OC的时候,也被setget方法烦到不行。但是万能的程序猿同学还是给出了一种方便又简捷的办法来书写setget方法。
2、利用@property来简写setget方法
User.h文件:
1 #import <Foundation/Foundation.h> 2 3 @interface User : NSObject 4 @property NSString * name; //定义字符串变量 5 @property NSString * sex; 6 @property NSInteger age; //定义整型变量 7 /*********其他方法*********/ 8 /**定义声明类的方法*/ 9 - (void) createMyClass; 10 11 @end 12 13 //没错,这样我们就完成了Users这个类接口部分的编写!!
User.m文件:
1 #import <Foundation/Foundation.h> 2 #import "User.h" 3 4 @implementation User 5 /**声明类的方法*/ 6 - (void) createMyClass{ 7 NSLog(@"声明一个名为User的类"); 8 } 9 10 @end 11 //至此我们就完成了Users这个类实现部分的编写!!
12 //初学的同学一定是已经惊呆了,为什么可以这么简单。。。。。。笔者写到这回想昨天那段代码,对象三个属性就写的笔者泪流满面了。。。。。。。
>>使用@property请注意一下几个事项:
>>>1、使用@property时,父类名后边的花括号省略。
>>>2、使用@property时,会严格按照setget的写法自动生成setget方法对应的接口部分和实现部分,这就是为什么setget在书写的时候会有严格的要求。
>>>3、如果想要对setget生成的方法进行改写,只需要按照原来的要求与格式,在setget的实现部分进行更改就可以了。
- 利用点语法给对象属性赋值
1、首先来复习一下上一篇中如何set方法给对象的属性赋值
1 #import <Foundation/Foundation.h> 2 #import "User.h" 3 4 //定义main方法,作为程序入口 5 int main(int argc,char *argv[]) 6 { 7 @autoreleasepool //自动释放池 8 { 9 User * user1=[[User alloc]init]; //声明对象并开辟对象的内存空间 10 [user1 setName:@"Jereh"]; //调用set方法给字符串型变量name赋值 11 [user1 setSex:@"Male"]; //调用set方法给字符串型变量sex赋值 12 [user1 setAge:18]; //调用set方法给整型变量sex赋值 13 [user1 createMyClass]; //调用createMyClass方法,打印“声明一个名为User的类” 14 NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",[user1 name],[user1 sex],[user1 age]); //打印用户信息,User1后边的name,sex,age均使用了get方法来获取对象的属性 15 } 16 return 0; //返回值 17 }
2、利用点语法给对象属性赋值的写法
1 #import <Foundation/Foundation.h> 2 #import "User.h" 3 4 //定义main方法,作为程序入口 5 int main(int argc,char *argv[]) 6 { 7 @autoreleasepool //自动释放池 8 { 9 User * user1=[[User alloc]init]; 10 user1.name=@"Jereh"; //点语法给对象user1的属性name赋值 11 user1.sex=@"Male"; //点语法给对象user1的属性sex赋值 12 user1.age=18; //点语法给对象user1的属性age赋值 13 [user1 createMyClass]; 14 NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",user1.name,user1.sex,user1.age); //打印用户信息,使用点语法来获取对象的属性 15 } 16 return 0; //返回值 17 }
- 利用自定义构造方法来给对象赋值
1、首先来看一段代码
User.h文件:
1 #import <Foundation/Foundation.h>
2
3 @interface User : NSObject
4 @property NSString * name; //定义字符串变量
5 @property NSString * sex;
6 @property NSInteger age; //定义整型变量
7 /*********其他方法*********/
8 /**定义声明类的方法*/
9 - (void) createMyClass;
10 - (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age; //定义一个自定义构造方法,注意返回值类型和方法格式的书写
11
12 @end
User.m文件:
1 #import <Foundation/Foundation.h> 2 #import "User.h" 3 4 @implementation User:NSObject 5 /**声明类的方法*/ 6 - (void) createMyClass{ 7 NSLog(@"声明一个名为User的类"); 8 } 9 - (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age{ 10 self = [super init]; //关于self和super详细解惑请参考:http://www.cnblogs.com/tangbinblog/p/4034890.html 11 if (self) { 12 _name=name; 13 _sex=sex; 14 _age=age; 15 } 16 return self; 17 } 18 @end
main.m文件:
1 #import <Foundation/Foundation.h> 2 #import "User.h" 3 4 //定义main方法,作为程序入口 5 int main(int argc,char *argv[]) 6 { 7 @autoreleasepool //自动释放池 8 { 9 User * user1=[[User alloc]initWithName:@"Jereh" andSex:@"Male" andAge:18]; //自定义构造方法调用,替代init直接输入变量 10 [user1 createMyClass]; 11 NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",user1.name,user1.sex,user1.age); //打印用户信息,使用点语法来获取对象的属性 12 } 13 return 0; //返回值 14 }
输出结果:

2、自定义构造方法使用注意事项
>>>1、在.h文件中,定义自定义构造方法时,返回值类型一般为instancetype,声明方法开头必须以initWithXxx:开始,严格按照驼峰法则命名。若需要同时声明多个属性的初始化,中间则必须用andXxxx连接,且必须使用驼峰法则命名。
>>>2、在.m文件中,实现自定义构造方法时,花括号里面的格式是固定的,其中self指的是当前对象的指针,[super init]意思是调用父类NSObject中的init方法返回一个初始化好的对象给self,加if判断当前对象不为空时,给当前对象的属性赋值,最后再把赋值好的对象返回给你在main.m中初始化的对象名称。
>>>3、自定义构造方法调用时,必须按照要求的格式进行书写,变量和变量类型必须匹配。
二、类方法和对象方法
- 类方法和对象方法的书写
1、首先先看下面的程序段:
User.h文件:
1 #import <Foundation/Foundation.h> 2 3 @interface User : NSObject 4 @property NSString * name; 5 @property NSString * sex; 6 @property NSInteger age; 7 /**声明对象方法 */ 8 - (void) createMyClass; 9 /**声明类方法 */ 10 + (void) createMyClass; 11 /**声明一个自定义构造方法方法 */ 12 - (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age; 13 @end
User.m文件:
#import <Foundation/Foundation.h> #import "User.h" @implementation User:NSObject /**声明类的方法*/ - (void) createMyClass{ NSLog(@"这是对象方法输出的结果"); } /**声明类方法 */ + (void) createMyClass{ NSLog(@"这是类方法输出的结果"); } /**实现自定义构造方法 */ - (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age{ self = [super init]; if (self) { _name=name; _sex=sex; _age=age; } return self; }
main.m文件:
#import <Foundation/Foundation.h> #import "User.h" //定义main方法,作为程序入口 int main(int argc,char *argv[]) { @autoreleasepool //自动释放池 { User * user1=[[User alloc]initWithName:@"Jereh" andSex:@"Male" andAge:18]; [user1 createMyClass]; [User createMyClass]; } return 0; //返回值 }
输出结果:

2、对象方法和类方法的异同
>>对象方法书写格式
>>>无返回值无参数的对象方法 -(void)方法名;
>>>无返回值有参数的对象方法 -(void)方法名:(参数类型)参数名;
>>>有返回值无参数的对象方法 -(返回值类型)方法名;
>>>有返回值有参数的对象方法 -(返回值类型)方法名:(参数类型)参数名;
>>对象方法调用
>>>[调用对象 对象方法名]
>>类方法书写格式
>>>无返回值无参数的类方法 +(void)方法名;
>>>无返回值有参数的类方法 +(void)方法名:(参数类型)参数名;
>>>有返回值无参数的类方法 +(返回值类型)方法名;
>>>有返回值有参数的类方法 +(返回值类型)方法名:(参数类型)参数名;
>>类方法调用
>>>[调用类 类方法名]
- 关于类方法和对象方法的使用
1、类方法是属于整个类的方法,而不属于某个对象,所以单个对象无法调用类方法
2、类方法无需定义成员变量就可以实现,但无法访问成员变量,即系统只会调用类方法,不会调用对象方法
3、类方法效率较高
4、对象方法必须有对象才可以实现
5、类方法不能被覆盖,对象方法则可以被覆盖
6、类方法的适用场合
>>1、当初始化对象的时候可以使用类方法
>>2、当该方法涉及不到成员变量的时候可以使用类方法
>>3、封装一些工具类的时候可以使用类方法
浙公网安备 33010602011771号