内存管理 ios
用alloc,new,copy和mutableCopy创建的对象必须自己释放,其他对象都可以当成是引用计数为1且位于自动回收池中。
1. NSString *second = [[NSString alloc] init]; //second的引用计数为1
[someStringArray addObject: second]; //2 。被插入数组中,数组回自动持有加入其中对象。//需要一次release
2. NSString *sixth = [NSString stringWithString:@"Toughie"]; //1
NSArray *anotherArray = [NSArray arrayWithObjects: sixth count:1]; //2
NSDictionary *newDictionary = [NSDictionary dictionaryWithObjects:sixth forKeys: @"toughie" count:1]; //3
NSString *ignoreMe = [sixth retain]; //4.最后需要一次release,对应retain
管理对象图以避免内存泄漏:
对象之间的引用还有强弱之分,默认情况下,Objective-C 中的引用是强引用。这通常是件好事,但是,一不小心,对象之间的强引用会形成一个不能断开的引用链,如图,如果断开 A 和 B 之间的引用,则包含 B、C、D 和 E 的子图形将“永远”存在。对强引用循环的解决之道,在于明智地使用弱引用,一个对象未被强引用时,该对象将被释放,对该对象的所有弱引用都会设定为 nil
。对于变量(全局、实例和局部),在变量名称前面使用 __weak
限定符,以将引用标记为弱。
-
委托
@property(weak) id delegate;
将在“设计模式”文章“采用设计模式使您的应用程序合理化”中了解有关委托和目标的信息。
-
未引用顶级对象的 Outlet
@property(weak) IBOutlet NSString *theName;
Outlet 是对象之间的连接(或引用),归档在串联图或 nib 文件中,且在应用程序载入该串联图或 nib 文件时得到恢复。串联图或 nib 文件中顶级对象(通常是窗口、视图、视图控制器或其他控制器)的 outlet 应该为
strong
(默认值,因此无标记)。 -
目标
(void)setTarget:(id __weak)target
-
在块内对
self
的引用__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
一个块对它所捕捉的变量构成强引用。如果在块内使用
self
,该块对self
构成强引用。因此,如果self
也具有对该块的强引用(通常都有),将产生强引用循环。要避免循环,您需要在块外创建对self
的weak
(或__block
)引用,如以上例子所示。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步