黑马程序员——ObjC基础—隐含方法

----------- Java 培训Android 培训IOS 培训.Net 培训、期待与您交流!------------ 
在OC对象中有一些约定俗成的方法,我们需要按照既定的格式去书写,这样有利于保证对象的标准化。

1、-init方法(构造方法)
在前面的学习中,我们多次遇到一个特殊的方法 new方法,这是一个快速创建对象的方法,他其实包括两个步骤,先用alloc方法为对象分配空间,然后调用init方法来初始化此空间。alloc方法是在NSObject类中创建的方法,我们不做过多讨论,这里我们主要学习init方法。
init方法又称为构造方法,说白了,他就是对对象新分配的属性的一个赋值操作。默认情况下,Xcode为我们自动创建init方法,方法会把各属性初始化为0或者nil。如果我们愿意,也可以自己来重写这个方法:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic) int age;
@end
@implementation Person
- (id)init{ // 重写init方法
    if (self = [super init]) { // 标准写法,这句代码保证该对象继承自父类的属性也能初始化,并确保初始化完成
        _name = @"Someone";
        _age = 0;
    }
    return self; // 初始化完成后,返回对象本身
}
@end
上面是我们重写的init方法,唯一疑惑的地方是if(self = [super init]),完整的写法是:
self = [super init]
if (self!=nil){}
关于有没有必要这么写,是OC界一个比较争议的话题,我们不在这里做讨论,只需要知道,这是公认的一种写法。
如果我们调用new方法,可以发现也是会调用这个重写的方法的。
我们也可以定义自己的初始化方法,如下:
- (id)initWithName:(NSString*)name andAge:(int)age{
    if (self = [super init]) { // 标准写法
        _name = name;
        _age = age;
    }
    return self; // 初始化完成后,返回对象本身
}
这个方法的方法名是我们随便定义的,但是注意一下,上面例子中的方法名是一般的命名方法,最好遵循这个方式来命名,这样可以方便大家使用我们设计的类。这个方法要求我们输入初始值,不能再使用new方法,操作如下:
    Person *p=[[Person alloc] initWithName:@"Xioaming" andAge:12];
这种先alloc之后,采用自定义构造方法的方式使用比较普遍,以后尽量摒弃new方法的使用。

2、+description方法
大家有没留意到我们用NSLog函数的时候,能够使用%@操作符来输出对象的一些参数,这是怎么实现的呢?
原来在每个对象类中都存在一个description方法,用于输出对象的一些特性,默认情况下,我们自定义的对象类中的这个方法不输出任何内容,我们可以重写这个方法,以输出必要的对象信息,输出格式可以自己定义。如下:
@interface Student : Person
@property (nonatomic) int number;
@end
@implementation Student
+ (NSString *)description{
    return [NSString stringWithFormat:@"%@\nnumber = %d\n",
            [super description], // 父类调用
            _number]; // 输出number
}
@end
我们设计了一个Person类的子类,在这个类里,我们重写了description方法,注意其中有调用父类的方法,以保证整个继承链的完整。来看看会有什么效果:
    Student *s=[Student new];
    s.name = @"Xiaoming";
    s.age = 18;
    s.number = 12;
    
    NSLog(@"%@", s); // 通过%@输出对象参数
输出:
2015-02-15 19:19:21.627 Study[2682:303] <Student: 0x10010a0c0>
number = 12
<Student:0x10010a0c0>是NSObject类通过description方法返回的内容,number = 12是Student类我们重写description方法返回的值,s.name和s.age是Person类里的属性,由于Person类里我们没有重写方法,所以就没有输出。
我们也可以根据自己的需要,来进行个性化的description输出。不再继续讨论。

3、+load方法和+initialize方法
这也是每个类中隐藏的两个方法,在程序运行的时候,会自动调用每个类里的+load方法(父类->子类->分类),在每个类被调用的第一次会调用+initialize方法(父类->子类/分类),这两个方法都只会调用一次,我们可以用来监听类的调用和做一些提前工作。只需要重写相应的方法即可。
+ (void)load{
    // 自定义代码
}
+ (void)initialize{
    // 自定义代码
}

4、-dealloc方法
-dealloc方法是和-alloc方法对应的方法,alloc方法用于对象的创建,而-dealloc方法则在每一个对象被销毁前被调用(注意,不是说dealloc负责销毁对象)。在OC中我们采用引用计数的方式来管理内存,基本的原理是每一个对象都有一个引用计数的参数,这个值为0的时候,系统会自动帮我们销毁对象(在销毁前调用-dealloc方法)。
每当有一个指针指向对象,计数值就会加1,相应的,在不需要这个指针的时候,需要我们手动去将引用计数减1(调用release方法),假设我们设计了一个类,他里面包含另一个对象属性,当这个对象被销毁的时候,我们希望他取消对另一个对象的引用,这样以来,我们就可以在-dealloc方法中进行操作。需要注意的是,在Xcode4,4版本之后,采用自动引用计数管理,这样以来,我们的dealloc方法几乎不用我们自己去写,但这不是绝对的。
a、对于一些无法使用自动引用计数的情况,需要我们手动去计数;
b、我们用malloc自己分配的空间,需要我们自己去清理;
c、既然这个功能是在对象被销毁之前调用,当然我们也可以用来监听对象的销毁。
关于内存管理,将有专门的章节来系统的学习。

5、其他
对象中还有很多隐含的方法,我们在此不做赘述,大家可以通过Xcode的control+鼠标左键定位到NSObject类的接口文件来查看。



----------- Java 培训Android 培训IOS 培训.Net 培训、期待与您交流!------------ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值