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] 哪些变量默认初始化为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
  • 1816

Objective-C 中便利初始化方法和指定初始化方法

初始化 之 便利初始化和指定初始化便利初始化方式便利初始化方式一-(id) initWithFormat:(NSString *) format,...; 初始化了一个新的字符串作为格式化操作的...
  • www_nyp_boke
  • www_nyp_boke
  • 2015年07月03日 21:53
  • 871

Objective-C:初始化、实例方法、类方法、工厂方法、单例模式

初始化 无参初始化 1.1 init是从父类NSObject中继承的,所以不需要在.h文件中声明 带参初始化 2.1 方法名的格式为:-(id)initWith… 2.2 instancetyp...
  • cz_zol
  • cz_zol
  • 2016年08月24日 21:01
  • 601

【Objective-C基础】对象初始化

原文:http://www.cnblogs.com/margincc/archive/2010/11/25/2095067.html  obj中创建新对象有两种方式:[classname new...
  • hudashi
  • hudashi
  • 2016年06月29日 16:14
  • 943

Objective-C学习- 便利初始化函数和便利构造器

之前在 博客园 用 为你前行 的昵称曾经写过一篇关于  便利化初始化函数  和   便利构造器  的博客,博客搬家没有搬过来,所以就在这里从重新写一下,最新的便利初始化函数和便利构造器的想法。 有过...
  • RunIntoLove
  • RunIntoLove
  • 2015年08月04日 14:34
  • 1317

Objective-C(五、@class,id类型,类对象构造方法,加载和初始化,description,Logging宏)——iOS开发基础

类的前置声明@class,与#import的比较;id类型;类对象的构造方法alloc,init;加载load和初始化initialize;description方法;几个对Logging有用的宏...
  • Zsk_Zane
  • Zsk_Zane
  • 2015年06月27日 16:15
  • 1615

objective-c对象初始化

两种初始化方法:[Class new]    [[Class alloc]init]  两者等价,惯用后者  分配对象        分配(allocation)是一个新对象诞生的过程。是从操...
  • baibai_1990
  • baibai_1990
  • 2013年01月09日 13:26
  • 205

浅谈 Objective-C 下对象的初始化

原文来自:OSChina 众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类时,总要提供一个初始化方法,一般大家都是这样写的: ...
  • u010013695
  • u010013695
  • 2013年09月10日 09:33
  • 1085

Objective-C对象初始化简要

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

浅学Objective-C 初始化方法

前言在一开始学习objective—C,各种初始化声明让我难以下手,可以说对初始化有点畏惧,在这里做个梳理和记录,希望对同样困扰的人有所帮助。 初始化方法初始化方法用于初始化当前对象、实例变量。 苹果...
  • Mao_EZ
  • Mao_EZ
  • 2017年01月10日 16:18
  • 104
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C 初始化
举报原因:
原因补充:

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