标签: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