zoukankan      html  css  js  c++  java
  • Objective-C初始化方法

    1、初始化方法:

    #import <Foundation/Foundation.h>

    @interface Person : NSObject{  

        NSString *_name;  

        NSInteger _age;  

    }  

    //自定义初始化方法,必须以init开头  

    - (id)initWithName:(NSString *)name withAge:(NSInteger)age;  

    //打印信息  

    - (void)showInfo;  

    @end  

    这里我们定义了一个初始化方法,对名称和年龄进行初始化赋值操作

    方法实现:

    #import "Person.h"  

    @implementation Person  

    - (id)initWithName:(NSString *)name withAge:(NSInteger)age{  

    //固定写法,可以背下来哦~~  

    //调用父类的初始化方法  

    self = [super init];  

    if(self != nil){  

            _name = name;  

            _age = age;  

        }  

    return self;  

    }  

    @end

    注:OC中自定义初始化方法的名称必须是以init开头

    OC实例变量初始化方法

    1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx

    2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx

    3 使用实例初始化方法 initWith开头的方法

    4 使用构造器 类名+With…

    以Person  Student两个类为例

    1 使用实例 setter方法

    这是最麻烦的方法

    @interface Person : NSObject
    {
    NSString *_name;
    NSString *_sex;
    int _age;
    }


    //setter方法
    -(void)setName:(NSString *)name;
    -(void)setSex:(NSString *)sex;
    -(void)setAge:(int)age;
    @end


    @implementation Person
    //setter方法
    -(void)setName:(NSString *)name
    {
    _name = name;
    }
    -(void)setSex:(NSString *)sex
    {
    _sex = sex;
    }
    -(void)setAge:(int)age
    {
    _age = age;
    }


    @end


    @interface Student : Person
    {
    NSString *_studentID;
    float _score;
    }
    //setter
    -(void)setStudentID:(NSString *)studentID;
    -(void)setScore:(float)score;


    @end


    @implementation Student : Person


    //setter
    -(void)setStudentID:(NSString *)studentID
    {
    _studentID = studentID;
    }
    -(void)setScore:(float)score
    {
    _score = score;
    }
    @end


    int main()
    {
    Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
    //使用setter方法为实例变量赋值。
    [stu setName:@"xiaoA"];
    [stu setSex:@"Man"];
    [stu setAge:15];
    [stu setStudentID:@"2008-07"];
    [stu setScore:96];


    return 0;
    }

    2 使用实例功能类方法赋值
    简单于setter方法

    @interface Person : NSObject
    {
    NSString *_name;
    NSString *_sex;
    int _age;
    }


    -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age;


    @end


    @implementation Person


    -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age
    {
    _name = name;
    _sex = sex;
    _age = age;
    }


    @end


    @interface Student : Person
    {
    NSString *_studentID;
    float _score;
    }


    -(void)setStudentID:(NSString *)studentID score:(float)score;
    @end


    @implementation Student : Person


    -(void)setStudentID:(NSString *)studentID score:(float)score
    {
    _studentID = studentID;
    _score = score;
    }
    @end


    int main()
    {
    Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
    //使用setter方法为实例变量赋值。
    [stu setName:@"xiaoA" sex:@"Man" age:15];
    [stu setStudentID:@"2008-02" score:97];

    return 0;
    }

    3 使用实例初始化方法 initWith开头的方法
    这是一种比较常用的方法

    @interface Person : NSObject
    {
    NSString *_name;
    NSString *_sex;
    int _age;
    }


    -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age;


    @end


    @implementation Person


    -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age
    {
    self = [super init];
    if(self)
    {
    _name = name;
    _sex = sex;
    _age = age;
    }
    return self;
    }


    @end


    @interface Student : Person
    {
    NSString *_studentID;
    float _score;
    }


    -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score;
    @end


    @implementation Student : Person


    -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
    {
    self = [super initWithName:name sex:sex age:age];
    if(self)
    {
    _studentID = studentID;
    _score = score;
    }
    return self;
    }


    @end


    int main()
    {
    Student *stu = [[Student alloc]initWithName:@"xiaoA" sex:@"Man" age:15 studentID:@"2008-2" score:97];//开辟空间调用初始化方法

    return 0;
    }


    这种赋值方法有几点需要注意:
    1) 自写初始化函数需要 以 initWith开头  必须形如 initWith…注意大小写
    2 )一个类里可以有多个初始化方法,但是只能有一个“指定初始化”方法,指定初始化方法是在调用任意一个初始化方法的时候都会默认被调用的初始化方法,也就是说 指定初始化方法是在其它初始化方法里面被调用的,每一个初始化方法内部必须调用指定初始化方法,这不是规则,而是通用的原则。
    如 上例做如下修改:
    添加一个初始化方法:
    h文件声明:
    -(void)initWithStudentID:(NSString *)studentID score:(float)score;
    m文件实现:
    -(void)initWithStudentID:(NSString *)studentID score:(float)score
    {
    self = [self initWithName:NIL sex:NIL age:NIL studentID:studentID score: score
    }
    3 )注意继承的初始化的写法
    4) self类似与其它语言的this指针,指向当前的对象,如果在方法里面类调用 就指代当前类,对象调用就指代当前对象


    4 便利构造器方法
    便利构造器书写规则 
    类方法  开头以类名开头类名首字母小写 后续驼峰法,属于类方法 用+号


    如上例定义便利构造器
    +(void)studentWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
    {
    Student *stu = [[self alloc]studentWithName:name sex:sex age:age studentID:studentID score:score]; 

    }


    此时,创建对象的方法就变成了
    int main
    {
    Student *stu = [Student studentWithName:@"xiaoA" sex:@"Man" age:16 studentID:@"2008-02" score:97]


    return 0;
    }
    这种方法创建对象就很便捷了,因为无需每次手动申请空间,调用alloc函数。
    一个初始化函数里面只能有一个super init类的方法,这样能保证多个入口一个出口,避免混乱。

     

  • 相关阅读:
    SVN与TortoiseSVN实战:标签与分支
    IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
    IOS性能调优系列:使用Allocation动态分析内存使用情况
    IOS性能调优系列:使用Instruments动态分析内存泄漏
    IOS性能调优系列:Analyze静态分析
    2014年个人知乎收藏夹整理
    IOS开发环境更换后重新制作Provisioning Profile证书详解
    使用VS2010编译MongoDB C++驱动详解
    ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项
    std::string在多字节字符集环境下substr的实现方法
  • 原文地址:https://www.cnblogs.com/wangliyuan/p/4730558.html
Copyright © 2011-2022 走看看