现在iOS的内存管理是怎么样的?

iOS 码拜 10年前 (2015-05-02) 1028次浏览 0个评论
 

是不是有了ARC后,就不用关心对象的内存释放了?我发现在xcode里不能用release、
retain、dealloc这些方法了,是不是现在就创建对象,不用管释放了,就像Java一样?

这样的话,创建对象是不是用Person *person = [[Person alloc] init];就可以了,
剩下的就不要管了?原来iOS里还有[Person new],这个new和alloc+init有区别吗?用
那个比较好?

现在iOS的内存管理是怎么样的?
10分
创建对象是不是用Person *person = [[Person alloc] init];就可以了
基本上是这样的,有些比较特殊的地方注意一下就行了,比如vc关闭的时候记得delegate=nil,不然crash

原来iOS里还有[Person new],这个new和alloc+init有区别吗?用那个比较好?
区别肯定是有一些小区别,官方建议用alloc +init,new的方法基本上没有人用了

现在iOS的内存管理是怎么样的?
11分
ARC为自动内存管理,顾名思义:就是内存管理交给编译器自动管理。就像你说的,你只需要创建对象就行,不需要再考虑什么时候去释放对象。release,retain 都是手动管理内存时代用到的会改变引用计数的方法,在ARC之后,这些方法被废弃。

创建对象时,可以使用 Person *person = [[Persion alloc] init];  至于你说的new  与 alloc init的区别,应该说两者是基本上一样的。
可以看new 的源代码:

+ new 
{ 
id newObject = (*_alloc)((Class)self, 0); 
Class metaClass = self->isa; 
if (class_getVersion(metaClass) > 1) 
return [newObject init]; 
else 
return newObject; 
}

 
通过源码中我们发现,[className new]基本等同于[[className alloc] init];
区别只在于alloc分配内存的时候使用了zone.
不推荐使用new的原因是因为你在创建对象时固定在了调用默认的初始化方法init上,如果有initWith这样的方法,显然不行了。

现在iOS的内存管理是怎么样的?
19分
1. ARC的做法其实很简单,分为编译时和运行时,release 、autorelease方法依然是有效的,只不过编译器(LLVM)不让你手动调用,改为了在编译期自动插件release代码,如以下代码:

int main(int argc, const char * argv[]) {
    {
        NSObject *obj = [NSObject new];
        // 1.
    }
    return 0;
}

在注释为1的地方将自动插入release:

{
        NSObject *obj = [[NSObject alloc] init];
        [obj release];
}

那是否用了ARC后我们就不用担心内存问题了呢?当然不是了,因为编译时的ARC只是做了最简单的工作,你不用写release这些代码而已,但是曾经那些导致内存出现问题的情况依然是存在的,如果你想优化某个方法中的内存使用,还是可以用@autoreleasepool {}(运行时的ARC),还是会出现循环引用、自引用、messages sent to deallocated objects等问题,所以曾经那些内存管理原则依然要铭记于心。

2. 关于new的问题,其实:
new = alloc + init
早期的OC是没有alloc init方法的,创建对象只有通过new,后来为了方便把分配内存和用于初始化的属性逻辑放在一个方法里(如指定zone),才引入了alloc/init方法。现在有时new反过来方便我们更加简洁的创建对象,你可以放心使用。
Apple文档中的描述:

引用

Allocates a new instance of the receiving class, sends it an init message, and returns the initialized object.


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明现在iOS的内存管理是怎么样的?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!