关闭

Objective-C 初始化

标签: objective内存设置
541人阅读 评论(0) 收藏 举报
分类:

初始化

对象分配内存

+ (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];
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15488次
    • 积分:476
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论