OC MRC之set方法内存管理(代码分析)

  1 //
  2 //  main.m
  3 //  03-set方法的内存管理
  4 //
  5 //  Created by apple on 13-8-9.
  6 //  Copyright (c) 2013年 itcast. All rights reserved.
  7 //
  8 
  9 
 10 #import <Foundation/Foundation.h>
 11 
 12 @interface Dog : NSObject
 13 
 14 @end
 15 
 16 #import "Dog.h"
 17 
 18 @implementation Dog
 19 
 20 @end
 21 
 22 
 23 
 24 #import <Foundation/Foundation.h>
 25 
 26 @interface Car : NSObject
 27 {
 28     int _speed;
 29 }
 30 
 31 - (void)setSpeed:(int)speed;
 32 - (int)speed;
 33 @end
 34 
 35 #import "Car.h"
 36 
 37 @implementation Car
 38 - (void)setSpeed:(int)speed
 39 {
 40     _speed = speed;
 41 }
 42 - (int)speed
 43 {
 44     return _speed;
 45 }
 46 
 47 
 48 - (void)dealloc
 49 {
 50     /*
 51      _speed :直接访问成员变量
 52      self->_speed :直接访问成员变量
 53      self.speed : get方法
 54      [self speed] : get方法
 55      */
 56     
 57     NSLog(@"速度为%d的Car对象被回收了", _speed);
 58     
 59     [super dealloc];
 60 }
 61 @end
 62 
 63 
 64 
 65 
 66 
 67 
 68 #import <Foundation/Foundation.h>
 69 #import "Car.h"
 70 
 71 @interface Person : NSObject
 72 {
 73     Car *_car;
 74     int _age;
 75 }
 76 
 77 - (void)setAge:(int)age;
 78 - (int)age;
 79 
 80 - (void)setCar:(Car *)car;
 81 - (Car *)car;
 82 
 83 @end
 84 
 85 
 86 #import "Person.h"
 87 
 88 // _car -> c1  0
 89 
 90 @implementation Person
 91 - (void)setCar:(Car *)car
 92 {
 93     if (car != _car)
 94     {
 95         // 对当前正在使用的车(旧车)做一次release
 96         [_car release];
 97         
 98         // 对新车做一次retain操作
 99         _car = [car retain];
100     }
101 }
102 - (Car *)car
103 {
104     return _car;
105 }
106 
107 - (void)setAge:(int)age
108 { // 基本数据类型不需要管理内存
109     _age = age;
110 }
111 - (int)age
112 {
113     return _age;
114 }
115 
116 - (void)dealloc
117 {
118     // 当人不在了,代表不用车了
119     // 对车做一次release操作
120     [_car release];
121     
122     NSLog(@"%d岁的Person对象被回收了", _age);
123     
124     [super dealloc];
125 }
126 
127 @end
128 
129 
130 
131 
132 
133 
134 
135 #import <Foundation/Foundation.h>
136 #import "Car.h"
137 #import "Dog.h"
138 
139 @interface Student : NSObject
140 {
141     int _no;
142     NSString *_name;
143     Car *_car;
144     Dog *_dog;
145 }
146 
147 - (void)setNo:(int)no;
148 - (int)no;
149 
150 - (void)setName:(NSString *)name;
151 - (NSString *)name;
152 
153 - (void)setCar:(Car *)car;
154 - (Car *)car;
155 
156 - (void)setDog:(Dog *)dog;
157 - (Dog *)dog;
158 
159 @end
160 
161 
162 
163 #import "Student.h"
164 
165 @implementation Student
166 - (void)setNo:(int)no
167 {
168     _no = no;
169 }
170 - (int)no
171 {
172     return _no;
173 }
174 
175 - (void)setName:(NSString *)name
176 {
177     if ( name != _name )
178     {
179         [_name release];
180         _name = [name retain];
181     }
182 }
183 
184 - (NSString *)name
185 {
186     return _name;
187 }
188 
189 - (void)setCar:(Car *)car
190 {
191     if ( car != _car )
192     {
193         [_car release];
194         _car = [car retain];
195     }
196 }
197 - (Car *)car
198 {
199     return _car;
200 }
201 
202 - (void)setDog:(Dog *)dog
203 {
204     if ( dog != _dog )
205     {
206         [_dog release];
207         _dog = [dog retain];
208     }
209 }
210 - (Dog *)dog
211 {
212     return _dog;
213 }
214 
215 - (void)dealloc
216 {
217     [_name release];
218     [_car release];
219     [_dog release];
220     
221     [super dealloc];
222 }
223 @end
224 
225 
226 
227 
228 
229 
230 
231 
232 #import <Foundation/Foundation.h>
233 #import "Car.h"
234 #import "Person.h"
235 #import "Student.h"
236 #import "Dog.h"
237 /*
238  内存管理代码规范:
239  1.只要调用了alloc,必须有release(autorelease)
240    对象不是通过alloc产生的,就不需要release
241  
242  2.set方法的代码规范
243  1> 基本数据类型:直接复制
244  - (void)setAge:(int)age
245  { 
246     _age = age;
247  }
248  
249  2> OC对象类型
250  - (void)setCar:(Car *)car
251  {
252     // 1.先判断是不是新传进来对象
253     if ( car != _car )
254     {
255         // 2.对旧对象做一次release
256         [_car release];
257  
258         // 3.对新对象做一次retain
259         _car = [car retain];
260     }
261  }
262  
263  3.dealloc方法的代码规范
264  1> 一定要[super dealloc],而且放到最后面
265  2> 对self(当前)所拥有的其他对象做一次release
266  - (void)dealloc
267  {
268     [_car release];
269     [super dealloc];
270  }
271  */
272 
273 // 速度为100的车子:
274 // 速度为200的车子:p1->_car
275 
276 int main()
277 {
278     // stu - 1
279     Student *stu = [[Student alloc] init];
280     
281     // Car - 2
282     // 这行内存有内存泄露
283     //stu.car = [[Car alloc] init];
284     
285     // stu - 0
286     // Car - 1
287     [stu release];
288     
289     
290     // 这行内存有内存泄露
291     // [[Car alloc] init].speed = 100;
292     
293     return 0;
294 }
295 
296 
297 void test3()
298 {
299     Student *stu = [[Student alloc] init];
300     
301     
302     Car *c = [[Car alloc] init];
303     stu.car = c;
304     
305     
306     Dog *d = [[Dog alloc] init];
307     
308     stu.dog = d;
309     
310     
311     NSString *s = @"Jack";
312     
313     stu.name = s;
314     
315     [d release];
316     [c release];
317     [stu release];
318 }
319 
320 void test2()
321 {
322     Person *p1 = [[Person alloc] init];
323     p1.age = 20;
324     
325     // c1 - 1
326     Car *c1 = [[Car alloc] init];
327     c1.speed = 100;
328     // c1 - 2
329     p1.car = c1;
330     // c1 - 1
331     [c1 release];
332     
333     Car *c2 = [[Car alloc] init];
334     c2.speed = 200;
335     // c1 - 0
336     p1.car = c2;
337     
338     [c2 release];
339     
340     [p1 release];
341 }
342 
343 void test1()
344 {
345     // p-1
346     Person *p = [[Person alloc] init];
347     p.age = 20;
348     
349     // c1-1
350     Car *c1 = [[Car alloc] init];
351     c1.speed = 250;
352     
353     // c1-2
354     p.car = c1;
355     
356     // c1-1
357     [c1 release];
358     
359     
360     
361     p.car = c1;
362     p.car = c1;
363     p.car = c1;
364     p.car = c1;
365     p.car = c1;
366     p.car = c1;
367     p.car = c1;
368     
369     
370     
371     
372     [p release];
373 }
374 
375 void test()
376 {
377     // p-1
378     Person *p = [[Person alloc] init];
379     p.age = 20;
380     
381     // c1-1
382     Car *c1 = [[Car alloc] init];
383     c1.speed = 250;
384     
385     // p想拥有c1
386     // c1-2
387     p.car = c1;  // [p setCar:c1];
388     
389     // c2-1
390     Car *c2 = [[Car alloc] init];
391     c2.speed = 300;
392     
393     // p将车换成了c2
394     // c1-1
395     // c2-2
396     p.car = c2;
397     
398     // c2-1
399     [c2 release];
400     // c1-0
401     [c1 release];
402     // p-0 c2-0
403     [p release];
404 }
原文地址:https://www.cnblogs.com/oc-bowen/p/5053711.html