Objective C对象的alloc和release

时间:2015-12-21 19:01:15

标签: objective-c automatic-ref-counting

我是目标C的新手。我想知道为什么有些类在构建对象时不需要alloc。例如,班级NSNumber。构建对象:

NSNumber * strangeNum;
strangeNum = [NSNumber numberWithInteger:100];

不需要alloc,也不需要release

但如果我自己定义一个类,请说myClass并构建一个对象。我需要

myClass * myObj=[[myClass alloc] init];
...
[myObj release] // if without ARC

有人可以详细解释一下吗?非常感谢。

3 个答案:

答案 0 :(得分:1)

release方法几乎已被ARC(自动引用计数)淘汰,如果有的话,你很少会遇到更新的(过去几年)代码。要理解为什么不对从release获取的对象调用numberWithInteger:,您需要阅读Objective-C的内存管理策略,该策略目前可以在{{3}找到}}

alloc方法是一种类方法,是为NSObject下降的任何类分配内存的规范方法。类可以有任意数量的class方法,类方法可以代表您创建对象。在方法调用链中的某个地方,alloc将被调用,对于基础课程而言,它是您没有资源的,您不会看到它。

答案 1 :(得分:0)

第一个案例 - +[NSNumber numberWithInteger:]。这是一种类工厂方法。来自Apple documentation

  

类工厂方法应始终以类的名称开头   他们创建的(没有前缀),除了   具有现有工厂方法的类的子类。如果是   例如,NSArray类的工厂方法以数组开头。   NSMutableArray类没有定义任何自己的特定于类的   工厂方法,所以工厂方法仍然是一个可变数组   从数组开始。

类工厂方法返回自动释放的对象。通常它用作简单的快捷方式,调用相应的init方法:

+ (NSNumber)numberWithInteger:(int)intVal {
    return [[[self alloc] initWithInteger:intVal] autorelease];
}

第二种情况是NSNumber实例的显式创建。因为在创建实例后没有立即调用autorelease,所以在完成使用object释放已分配的内存后,应该调用release

因此,两个案例中的对象实例都通过allocinit来调用序列。

答案 2 :(得分:-2)

实际上NSNumber确实需要一个alloc,但是你正在使用一个静态方法来执行alloc。

如果您要查看NSNumber的源代码,则numberWithInteger的静态方法(非实例方法)可能是这样的

-(NSNumber)numberWithInteger:(int)intVal {
   NSNumber num = [[NSNumber alloc] init];
   *Some magic*
}

基本上,Apple刚刚为您提供了一些便利。