我是目标C的新手。我想知道为什么有些类在构建对象时不需要alloc
。例如,班级NSNumber
。构建对象:
NSNumber * strangeNum;
strangeNum = [NSNumber numberWithInteger:100];
不需要alloc
,也不需要release
。
但如果我自己定义一个类,请说myClass
并构建一个对象。我需要
myClass * myObj=[[myClass alloc] init];
...
[myObj release] // if without ARC
有人可以详细解释一下吗?非常感谢。
答案 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
。
因此,两个案例中的对象实例都通过alloc
和init
来调用序列。
答案 2 :(得分:-2)
实际上NSNumber确实需要一个alloc,但是你正在使用一个静态方法来执行alloc。
如果您要查看NSNumber的源代码,则numberWithInteger的静态方法(非实例方法)可能是这样的
-(NSNumber)numberWithInteger:(int)intVal {
NSNumber num = [[NSNumber alloc] init];
*Some magic*
}
基本上,Apple刚刚为您提供了一些便利。