是不是有了ARC后,就不用关心对象的内存释放了?我发现在xcode里不能用release、 这样的话,创建对象是不是用Person *person = [[Person alloc] init];就可以了, |
|
10分 |
创建对象是不是用Person *person = [[Person alloc] init];就可以了
基本上是这样的,有些比较特殊的地方注意一下就行了,比如vc关闭的时候记得delegate=nil,不然crash 原来iOS里还有[Person new],这个new和alloc+init有区别吗?用那个比较好? |
11分 |
ARC为自动内存管理,顾名思义:就是内存管理交给编译器自动管理。就像你说的,你只需要创建对象就行,不需要再考虑什么时候去释放对象。release,retain 都是手动管理内存时代用到的会改变引用计数的方法,在ARC之后,这些方法被废弃。
创建对象时,可以使用 Person *person = [[Persion alloc] init]; 至于你说的new 与 alloc init的区别,应该说两者是基本上一样的。 + new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->isa; if (class_getVersion(metaClass) > 1) return [newObject init]; else return newObject; } |
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的问题,其实: |