iOS 内存管理

2017-03-07  本文已影响45人  学而不思则罔思而不学则殆

ARC

ARC是 Object-C 编译特性, 不是运行时特性也不是垃圾回收机制, ARC 所做的只是在代码编译自动在合适的地方插入 release 或 autorelese, 只要没有强指针指向对象, 对象就会被释放

测试, 下面关于 Objective-C 内存管理的错误描述是

A. 当使用 ARC 来管理内存时, 代码中不可以出现 autorelease
B. autoreLeasePool 在drain 的时候会释放在其中分配的对象
C. 当使用 ARC 来管理内存的时候, 在线程中大量分配对象而不用 autoreleasepool 则可能会造成内存泄漏
D. 在使用 ARC 的项目中不能使用 NSZone

MRC文件在ARC工程混编时, 需要在文件的 Compiler Flages 上添加什么参数

A. -shared B. -fno-objc-arc C. -fobjc-arc D. -dynamic
参考答案: B

什么情况使用 weak 关键字, 相比 assign 有什么不同

什么情况下使用 weak 关键字

调用对象的 release 方法会销毁对象吗

下面代码有木有什么问题呀

for (int i = 0; i < someLargeNumber; ++i)
{
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@",string);
}

有问题的大兄弟, 每执行一次循环, 就会有一个 string 加到当前的 runloop 中的自动释放池中, 只有当自动释放池被 release 的时候, 自动释放池中的 标示了 autorelease 的这些数据所占用的内存空间才能被释放掉. 假设, 当 someLargeNumber 大到一定的成都的时候, 内存空间呗消耗干净又没有被释放掉, 就会出现内存溢出.

for(int i = 0; i<1000;i++) {
  NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];
  NSString *string = @"Abc";
  string = [string lowercaseString];
  string = [string stringByAppendingString:@"xyz"];
  NSLog(@"%@",string);
  // 释放池
  [pool1 drain];
 }

Object-C 对象的内存布局是怎样的

看下面代码, 第一个 NSLog 会输出什么, retainCount 是多少, 第二个和第三个呢, 为什么?

NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
[aryaddObject:str];
NSLog(@”%@%d”,str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@”%@%d”,str,[str retainCount]);
[aryremoveAllObjects]
NSLog(@”%@%d”,str,[str retainCount]);

看看下面 person 的 retainCount 值

Person * per = [[Person alloc] init];
self.person = per;

什么时候需要在程序中创建内存池

我们不创建内存池, 时候有内存池提供给我们.

苹果怎么实现 autoreleasepool的

autoreleasepool 以一个队列数组的形式实现, 主要通过以下三个函数完成,

objc使用什么机子管理对象内存

为什么要进行内存管理

objc 使用什么机子管理对象内存(或者内存管理方式有哪些)

内存管理原则

内存管理研究对象


未完待续

上一篇 下一篇

猜你喜欢

热点阅读