Keyo丶

导航

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、封装一些工具类的时候可以使用类方法

posted on 2016-05-06 15:29  Keyo丶  阅读(155)  评论(0)    收藏  举报