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 }