• 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 }
  • 相关阅读:
    【NX二次开发】获取体是实体还是片体UF_MODL_ask_body_type()
    【creo】CREO5.0+VS2019配置(还没写完)
    【NX二次开发】导出x_t、导入x_t例子,UF_PS_export_data、UF_PS_import_data
    UG_PS Parasolid相关的操作
    【NX二次开发】创建老版的基准平面uf5374
    UnityShader之固定管线命令Combine纹理混合【Shader资料4】
    UnityShader之固定管线Fixed Function Shader【Shader资料3】
    UnityShader之Shader分类篇【Shader资料2】
    UnityShader之Shader格式篇【Shader资料1】
    Unity3D事件函数的执行顺序
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5053711.html
Copyright © 2020-2023  润新知