标签:des c style class blog code
IOS设备的内存很有限,所以在OC中内存管理至关重要,虽然现在有ARC机制(自动管理内存),但是我们还是需要了解和清楚OC的内存管理。非OC对象是不需要进行内存管理的,因为非OC对象一般放在栈里面(栈内存会被系统自动回收),OC对象是放在堆里面的。
1.oc中对象创建
1
2
3 |
Person *p = [Person new ]; //或者 Person *p1 = [[Person alloc] init]; |
这行代码做了三件事:
①分配内存空间,存储对象 ②初始化成员变量 ③返回对象的指针地址
2.oc是如何对内存管理的呢
①每个对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器是系统回收对象的唯一依据,当它的引用计数器retainCount =0的时候,系统就会毫不犹豫的回收掉这个对象。
②[对象 retain] retainCount+1,返回self
③[对象 release] retainCount - 1
④@autoreleasepool{} 会对自动释放池中的对象都做一次release操作。
⑤ARC机制的实现细节是编译器会自动在适当的地方插入适当的retain,release,autorelease语句,让程序员更关注App业务。
3.内存管理的原则(配对原则)
只要出现了new,alloc,retain,copy就一定配对出现一个release,autorelease
4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name
1
2
3
4
5
6
7
8
9
10
11
12
13 |
- ( void )setName:( NSString
*)name: { if
(_name != name) { //relese旧值 [_name release]; //[nil release]; //retain新值 _name = [name retain]; //或者这么写 //_name = [name copy]; } } |
5.dealloc方法
那么我们怎么知道一个对象被销毁了呢,这时我们要重写dealloc方法
1
2
3
4
5 |
- ( void )dealloc { NSLog ( "对象被销毁了" ); [ super
dealloc]; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 |
// 定义一个强引用的属性 @property
( nonatomic , strong) UIViewController *vc; //懒加载 - (UIViewController *)vc { if
(_vc == nil ) { _vc = [[UIViewController alloc] init]; _vc.view.backgroundColor = [UIColor redColor]; UIButton *back = [UIButton buttonWithType:UIButtonTypeContactAdd]; [_vc.view addSubview:back]; back.center = CGPointMake(100, 300); [back addTarget: self
action: @selector (btnClick) forControlEvents:UIControlEventTouchUpInside]; } return
_vc; } - ( void )btnClick { [ self
dismissViewControllerAnimated: YES
completion: nil ]; } #pragma mark - Table view data source - ( NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger )section { return
10; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath
*)indexPath { //1.定义标识 static
NSString *ID = @ "测试" ; //2.通过标识去缓存池中寻找可循环利用的cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; //3.如果没有可循环利用的cell if
(cell == nil ) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } NSString
*text = [ NSString
stringWithFormat:@ "%d--%d" ,indexPath.row,indexPath.row]; cell.textLabel.text = text; return
cell; } - ( void )tableView:(UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath
*)indexPath { [ self
presentViewController: self .vc animated: YES
completion: nil ]; } |
初看代码,可能会觉得没什么问题.
我们在第六行和第十五行打两个断点来运行程序,观察一下_vc的内存地址。
1
2
3
4 |
//这个方法我们就要再完善下<br>- (void)btnClick { [ self
dismissViewControllerAnimated: YES
completion: nil ];<br> self .vc = nil ; } |
Objective-c的内存管理,布布扣,bubuko.com
标签:des c style class blog code
原文地址:http://www.cnblogs.com/yangyang1987/p/3757102.html