iOS:自动回调/基类的那些方法

+ (void)load;

  • 这是应用程序启动时(在didFinishLaunchingWithOptions之前)就会调用的方法,当load调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理;
  • 只会被调用一次(不同类),相当于程序运行前把程序中所有类的load方法调用一遍,之后再不调用;
  • 对于一个类而言,没有load方法实现就不会调用,不会考虑对NSObject的继承;
  • 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前;
  • 不会直接触发initialize的调用。

+ (void)initialize;

用来做一些初始化工作,或者单例模式的一种实现方案。

  • 第一次主动使用当前类的时才调用;
  • 在initialize方法收到调用时,运行环境基本健全;
  • initialize的运行过程中是能保证线程安全的;
  • 和load有点类似,子类不实现initialize方法,父类的&继承过来调用一遍。不同的是,在此之前,父类的方法可能已经被执行过一次了,同样不需要super调用。(注意:如果子类实现了initialize,或者父类的initialize的方法里有对self做类型判断,可以防止父类方法被多次调用)

备注:initialize和load相同点:

  • 在不考虑开发者主动使用的情况下,系统最多会调用一次;
  • 如果父类和子类都被调用,父类的调用一定在子类之前;
  • 都是为了应用运行提前创建合适的运行环境
  • 在使用时都不要过重地依赖于这两个方法,除非真正必要

参考:http://www.cocoachina.com/ios/20150104/10826.html


initWithCoder:

实现NSCoding协议,类实现了该方法,当从storyboard或者xib中创建时候,会回调该方法;

awakeFromNib:

类实现了该方法,当从storyboard或者xib中创建时候,会回调该方法;

备注:上俩个方法调用过程具体参考iOS:xib(Resource Programming Guide 部分) && IB


new 和 alloc/init的区别

+ new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
    return ;
else
    return newObject;
}
而 alloc/init 像这样:
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}- init
{
    return self;
}

上面可以看出,new基本等同于alloc+ init;区别只在于alloc分配内存的时候使用了zone,这个zone是什么?它是给对象分配内存的时候,把关联的对象分配到一个相邻的 内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;
而为什么不推荐使用new?如果使用new的话,初始化方法被固 定死只能调用init,而你想调用initXX怎么办?

+ allocFromZone:(void *) z
{
return (*_zoneAlloc)((Class)self, 0, z);
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}

alloc 和 init 分别把分配内存和初始化的工作分开,而且把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。而new 是把分配内存和初始化的工作一起完成了,只能采用默认的init方法完成初始化,而alloc的方式可以用其他定制的初始化方法。

`std::shared_ptr` 是 C++11 标准库中提供的一个智能指针,它可以自动管理对象的生命周期,当没有对象引用时会自动释放对象。使用 `std::shared_ptr` 时,可以将其基类指针指向派生类对象,这种用法得益于 C++ 的多态性。 当 `std::shared_ptr` 指向一个基类对象时,如果实际上它指向的是一个派生类对象,那么就会发生多态。这是因为在 C++ 中,如果一个派生类对象被当做基类对象来处理,那么在运行时,如果调用了一个虚函数,那么实际调用的是对象实际类型(即派生类)的版本。 为了使得这种多态行为能够正常工作,必须满足以下条件: 1. 基类中至少有一个虚函数,通常是虚析构函数,这样通过基类指针删除派生类对象时会调用正确的析构函数。 2. 使用 `std::shared_ptr` 指向基类时,确保其构造函数参数是基类类型的引用或指针,然后实际传递派生类对象的引用或指针。 使用 `std::shared_ptr` 实现多态时的代码示例如下: ```cpp #include <memory> class Base { public: virtual ~Base() {} // 基类需要一个虚析构函数 virtual void doSomething() { // 基类方法实现 } }; class Derived : public Base { public: void doSomething() override { // 派生类重写方法实现 } }; int main() { std::shared_ptr<Base> basePtr = std::make_shared<Derived>(); // 使用基类智能指针指向派生类对象 basePtr->doSomething(); // 多态调用,实际调用 Derived::doSomething return 0; } ``` 在这个例子中,尽管 `basePtr` 被声明为 `std::shared_ptr<Base>` 类型,但它实际指向一个 `Derived` 类型的对象。当调用 `doSomething` 方法时,由于 C++ 的多态性,将会执行 `Derived` 类中重写的 `doSomething` 方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值