Objective-C 初始化

原创 2015年07月07日 10:37:39

初始化

对象分配内存

+ (id) alloc;
  • 对象的诞生过程,主要是从操作系统获得一块足够大的内存,以存放该类的全部实例变量,并将其指定为 存放对象的实例变量的位置.
  • alloc方法同时将这块内存区域全部设置为0.(由于其他语言没有初始化带来了很多问题),结果是: BOOL 变量初始值为 NO, 所有的 int 类型变量为0,float 变量为0.0,所有的指针为 nil.

初始化对象

- (id) init;
  • 初始化的功能就是保障我们的实例变量是可用的完整对象,如: 我们在初始化中给类中依赖的其它的实例变量赋值
  • 有两种初始化思想.第一种就是初始化方法中将所有相依赖的对象全部创建并赋值,”开箱即用”;第二种是惰性求值,就是在初始化的时候先占位,在使用的时候,在确认具体的值.这两种方法需要根据业务来进行取舍.
  • 初始化方法的编写习惯:
- (id)init
{
    if (self = [super init]){

       //do something init content...
       }
}

开箱即用的初始化方式

个人理解就是把初始化的过程放到了方法中,应该说是封装到了方法中,当使用时,只需要调用此方法就能实现对象的初始化.并且,此时不需要setter,getter 方法的声明与实现

直接在对应的实现文件中定义:

- (id)init{
    if (self = [super init]) {
        engine = [[QYEngine alloc] init];

        tires = [[NSMutableArray alloc] initWithCapacity:4];
        for (int i = 0; i < 4; i++) {
            QYTire *tire = [[QYTire alloc] init];
            [tires addObject:tire];
            [tire release];
        }
    }
    return self;
}//开箱即用

调用时也非常简单,这届在主函数中调用即可

#import <Foundation/Foundation.h>

#import "QYCar.h"
#import "QYEngine.h"
#import "QYTire.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       //开箱即用
       QYCar *myCar = [[QYCar alloc] init];
        NSLog(@"Car info: %@",myCar);
        [myCar release];
     }
     return 0;
}

当然,代码并不完整,只需要在相应的实现文件中实现部分打印功能即可
输出的结果如下
Car info: I am engine,(
“I am tire”,
“I am tire”,
“I am tire”,
“I am tire”
)
2015-06-28 21:26:28.068 InitDemo[2276:1416754] car destory
2015-06-28 21:26:29.251 InitDemo[2276:1416754] engine destory
2015-06-28 21:26:29.251 InitDemo[2276:1416754] tire destory
2015-06-28 21:26:30.187 InitDemo[2276:1416754] tire destory
2015-06-28 21:26:31.621 InitDemo[2276:1416754] tire destory

懒加载初始化方式

感觉懒加载的方式比较麻烦,他不仅需要 setter,getter 方法的声明和定义,还需要在具体调用时进行现场的初始化方式

懒加载的初始化方式具体实现,在对应的实现文件中:

//懒加载
- (id)init{
    self = [super init];
    if (self) {
        tires = [[NSMutableArray alloc] initWithCapacity:4];

        for (int i = 0; i < 4; i++) {
            tires[i] = [NSNull null];
        }
    }
    return self;
}

- (void)setEngine:(QYEngine *)newEngine{
    [newEngine retain];
    [engine release];
    engine = newEngine;
}
- (QYEngine*)engine{
    return engine;
}
- (void)setTire:(QYTire *)newTire atIndex:(NSUInteger)index
{
  //数组的使用会使tires的引用计数器加1
//    [newTire retain];
//    [tires[index] release];
    tires[index] = newTire;

}
- (QYTire*)tireAtIndex:(NSUInteger)index{
    return tires[index];
}//懒加载

main() 中的代码也同样不少,其输出结果与上面相同.

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       //懒加载
        QYCar *myCar = [[QYCar alloc] init];
        QYEngine *engine = [[QYEngine alloc] init];

        [myCar setEngine:engine];
        [engine release];

        for (int i = 0; i < 4; i++) {
            QYTire *tire = [[QYTire alloc] init];
            [myCar setTire:tire atIndex:i];
            [tire release];
        }
        NSLog(@"Car info: %@",myCar);
        [myCar release];
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。违者小心我揍你!!

相关文章推荐

Objective-C对象初始化简要

1.分配对象 创建对象的两种方法 1.[类名 new] 2.[[类名 alloc] init] 最好用第二种,要不可能会出现bug 初始化时,最好不要创建其他对象,因为其他类未必用得上,会浪费资源,根...

Objective-C---2---初始化、便利构造器

1. 继承: 继承在OC中是单向的 OC中只允许单继承和C++不一样 子类可以重写父类的方法 声明子类的setter和getter方法时,只要实现自己的成员变量即可,不用写父类的,父类的已经封装完...

Objective-C中的便利初始化函数和便利构造器

程序在实际使用过程中,对象和对象的实例变量的值不一定相同,这个时候可以在init方法调用的时候传入一个我们需要的数据。 于是便有 便利初始化函数 框架类库中有一些init开头的方法,都是便利初始...

使用Objective-C的+(void)initialize初始化static变量

在《Objective C类方法load和initialize的区别》一文中,我介绍了Objective-C对待+(void)initialize和+(void)load两个方法在编译和执行时出现的不...

【Objective-C编程开发】关于子类重写父类初始化方法的争论

写出本篇文章实属不是我的本意,只因今天在相关技术群上有两个人争得耳红眼赤.今天趁着有空写出这个基础性内容,希望能帮到有些新手的疑惑。 观点A:认为在子类重写的init中没有必要进行self =[sup...

Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域

原文链接:http://www.cnblogs.com/yaski/7,对象的初始化以及实例变量的作用域本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,为了更好的理解本章内容,笔者建议你最...

Objective-C 2.0 对象的初始化以及实例变量的作用域

7,对象的初始化以及实例变量的作用域 本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,为了更好的理解本章内容,笔者建议你最好从本系列讲座的第1章开始阅读,请点击这里。  到目前为止,我...

Objective-C_继承、初始化方法、便利构造器

通过“打僵尸”示例,讲解Objective-C的继承、初始化方法和便利构造器

【IOS 开发学习总结-OC-15】objective-c面向对象之——对象初始化

创建对象有2种方法(本质是一样的,都是用 alloc 方法为对象分配内存空间)。 1.[[类名 alloc]init]; 2.[类名 new];为对象分配内存空间我们知道无论创建哪个对象,总需要先...

[Objective-C] 哪些变量默认初始化为0

参考: http://stackoverflow.com/questions/1786781/are-instance-variables-set-to-nil-by-default-in-objec...
  • yasi_xi
  • yasi_xi
  • 2015年07月07日 09:25
  • 1708
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C 初始化
举报原因:
原因补充:

(最多只允许输入30个字)