黑马程序员_OC内存管理

(一)Xcode设置:

 6.x版本Xcode是自动打开acr并且不报错僵尸对象的。更改方式为首先新建好Project,在工程Bulid SEttings下面的搜索

功能中输入关键字arc,再在下方的Apple LLVM 6.0-Language--ObjectiveC中的ObjectiveC  Automatic Reference

 Counting功能中选择NO。之后在运行按钮(左上方小箭头)边上的Edit scheme选项的run中勾选Enable Zombie

 Objects按钮。至此环境勾选好,我们才能测试接下来的内存管理代码。


(二)多对象内存管理:

IOS对象间肯定是多个对象有着千丝万缕的联系的。什么时候删除这个对象,什么时候计数器增加这些问题都对我们的

性能起着很大的作用。一般来说,有加必有减,谁加的谁减少,对象调用完毕后计数器最终都会变为0。当一个类碰到

alloc,new时,表示这个对象刚刚创建,此时计数器加1,然后应该写一个相应的release方法与之相对应。当一个对象

碰到了retain方法使计数器加1,也要有相应的release与之相对应。在多对象中,对象之前往往是有关系的。为了在对

象互相使用中不会出错,规定一个对象A使用另一个对象B时,那么这个对象B计数器应该加1,加1表示有一个人在用,

只有所有人都不用了,计数器归零的时候,这个对象B才会从内存中移除。

综上所述。当一个类用到了另一个类的东西时(成员变量里面有另一个类属性,或者是NSString字符串类型),用set

方法赋值时候应该先判断当前类是否已经赋值了这个类,如果没有,就使当前类的旧属性release1,新属性retain1。并

且在这个类死亡时候(dealloc),会释放这个类占有的其他类属性,不再是使用或者拥有关系,此时应该是当前属性调

用release方法-1。所以要重写这个包含其他类信息的成员变量的set方法和当前类的dealloc方法达成目的。下面代码分

析一下书写规范。

假设学生类和狗类,学生拥有一条狗,此时重写学生的狗成员变量的set方法


<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"><span style="font-size:18px;">- (void)setDog:(Dog *)dog</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">{</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    if (_dog =dog)</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    {</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">  [_dog release];
</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">     </span></span></div><div style="text-align: justify;"><span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">        [dog retain];</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    }</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"></div><div style="text-align: justify;"></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">}</span></span></div>



如上,如果这是一条新狗,就让我的旧狗属性计数器-1(我不要你了),新狗计数器+1,并且赋值给我的当前狗属性。


下面重写一下学生对象的dealloc方法

<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"><span style="font-size:18px;">- (void)dealloc{</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">   [_dog release];</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">   [super dealloc];</span></span></div><div style="text-align: justify;"></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">}</span></span></span></div>

如上,[ super  dealloc ]必须写且要写在delloc代码块的最后面。上面是在学生对象死亡(计数器归零)时候释放掉当前

狗对象(release)。这样才能做到有增必有减。

总结内存管理代码规范:


①只要调用了alloc,new必须有release(autorelease)。


②重写set方法基本规范:


当成员变量为基本数据类型时,因为不涉及到内存泄露,所以不用重写set方法。


当成员变量为OC对象时,重写set方法防止内存泄露。

- (void)setDog:(Dog *)dog
{
     if ((dog != _dog )) // 先判断是不是新传进来的值
    {
        [_dogrelease]; // 对旧对象做一次release
        _dog = [dogretain]; // 对新对象做一次retain并赋值给当前对象 
    }

}

③delloc方法重写规范:


一定要在最后调用[ super  alloc ]方法。

对当前拥有的其他OC对象成员变量都要进行一次release。

- (void)dealloc
{
    [ _dog release ];
    [superdealloc];

}

④内存泄露:

<span style="font-size:18px;"> Student *stu = [[Student alloc] init];</span>
<span style="font-size:18px;">  stu.dog = [[Dog alloc] init];    </span>
<span style="font-size:18px;">[[Dog alloc] init].speed = 40;</span>

分析:第一句创建了一个学生对象,并且由指针stu代表这个对象。第二句直接创建了一个狗对象通过set点语法赋值给


了stu的狗属性。狗对象刚创建出来时,alloc-->次数计数器为1,调用set方法赋值时,计数器为2.学生对象死亡


时,会release狗对象,此时狗对象计数器为1,狗对象已经没人指着它了,已经没有用了,但是还在内存中。造成了


内存的泄露。下面的一句代码道理依然如此。总体来说,还是有一个alloc就应该对应一个release,要不就会出错。


(三)Property自动生成内存管理代码:

以前用Property生成成员变量相应的set,get方法显得很方便。但是现在我们在内存管理中需要更改set方法的实现

。此时用到了property的参数功能。

1.set方法内存管理相关参数:

①retain:表示展开就是上述标准的set内存管理方法,release旧值,retain新值(适用于OC对象)。

②assign:是property默认的参数,直接赋值(适用于非OC对象类型)。

③copy:release旧值,copy新值。

2.是否要生成set方法:有时候,这个成员变量对外界来说是只读的。这时候只需要生成get方法。

①readwrite:读写,同时生成setter和getter的声明和实现。

②readonly:只读,只会生成getter的声明和实现。

3.多线程管理:

①nonatomic:性能高,一般选这个。

②atomic:性能低,默认是这个。

4.setter和getter方法的名称:就是更改setter和getter方法名,但是里面的参数,返回值是不变的。

①setter:决定了set方法的名称,一定要有个冒号 :

②getter:决定了get方法的名称。一般用于重写BOOL类型is....上。

同类型的参数不可以同时分配,不同类型的peoperty参数可以同时分配。

书写规格:

<span style="font-size:18px;">@property (retain,nonatomic,readwrite,setter=shy:) NSString *name;</span>

用来存放数据的类称之为模型类。现在用代码描述一个微博和用户的关系,加强property的使用:

User用户的.h:

<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import <Foundation/Foundation.h></span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">typedef enum {</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    Sexman,</span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">f struct {</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;"> </span></div></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    Sexwoman</span></div>} Sex;

<div style="text-align: justify;"></div>type
d
<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">e   int year;</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    int momth;</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">ce User : NS</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    int day;</span></div>} Date;
<div style="text-align: justify;"></div>@inter
f
<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">aObject</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">// 姓名,微博号码,密码,头像,性别,手机,生日</span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">ing *name;</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">@property (nonatomic,retain) NSSt</span></div></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">@property (nonatomic,retain) NSSt</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">rring *weibono;</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">@property (nonatomic,retain) NSString *password;</span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">mic,assign) Sex sex;</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">@property (nonatomic,retai</span></div></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">@property (nonatomic,retain) NSString *picture;</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">@property (nonat</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">on) NSString *phone;</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">@property (nonatomic,assign) Date birthday;</span></div><div style="text-align: left;"></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">@end</span></div>



User用户的.m:
<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import "User.h"</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@implementation User</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">// 姓名,微博号码,密码,头像,性别,手机,生日</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">- (void)dealloc</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">{</span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">];</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">    [_weibono rel</span></div></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    [_name releas</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">eease];</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    [_password release];</span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">ne release];</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">    [super</span></div></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    [_picture release];</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">    [_ph</span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">o dealloc];</span></div>}    
<div style="text-align: left;"></div><span style="font-size:18px;">@end</span>


WeiBo微博的.h
<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import <Foundation/Foundation.h></span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import "User.h"</span></span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">,微波发送人,转发的微波,被评论数,被转发数</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">@interface WeiBo</span></div></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">// 微波内容,微波配图,发送时</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">间 : NSObject</span></span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">natomic,retain) NSString *neirong;</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">@property (n</span></div></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@property (n</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">oonatomic,retain) NSString *picture;</span></span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">ime;</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">@property (nonatomic,retain) User *u</span></div></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@property (nonatomic,assign) time_t </span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">tser;</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@property (nonatomic,retain) WeiBo *weibo;</span></span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">ty (nonatomic,assign) int zhaunfa;</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">@end</span></div></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@property (nonatomic,assign) int pinglun;</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@prope</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">r</span></span></div>


WeiBo微博的.m
<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import "WeiBo.h"</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">// 微波内容,微波配图,发送时间,微波发送人,转发的微波,被评论数,被转发数</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    [_neirong release</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">@implementation WeiBo</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">- (void)dealloc</span></div>{
];
<div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">;</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">    [_weibo release];</span></div></div><span style="font-size:18px;">    [_picture release];
    [_user release
]
    [super dealloc];
}
@end
</span><div style="text-align: left;"></div>

   main():
<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import <Foundation/Foundation.h></span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import "User.h"</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#import "WeiBo.h"</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">int main()</span></div>{
<div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">er alloc] init];</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">    u1</span></div></div><span style="font-size:18px;">    // 创建用户1,输入名字,账号,性别
    
    User *u1 = [[U
s.name = @"梁萧";
    u1.weibono = @"ksca00892002";
    u1.sex = Sexman;
</span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">.nam</span></span></div><span style="font-size:18px;">    
    // 创建用户2,输入名字,账号,性别
    User *u2 = [[User alloc] init];
    u
2e = @"花花";
    u2.weibono = @"kstg3171525";
    u2.sex = Sexwoman;
    
</span><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">w1.neirong = @"黑马训练营";</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">    w1.u</span></div></div><span style="font-size:18px;">    // 创建微博1,输入微博内容,并且微博发送者是用户1
   WeiBo *w1 = [[WeiBo alloc] init];
   
 ser = u1;
    
    // 创建微博2,输入微博内容,并且微博发送者是用户2,然后转发微博1
    WeiBo *w2 = [[WeiBo alloc] init];
</span><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">lease</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"></span></span><div style="text-align: justify;">    [w2 release];</div><div style="text-align: justify;">   </div></div><span style="font-size:18px;">    w2.neirong = @"itcast";
    w2.user = u2;
    w2.weibo = w1;
    
    // 一个alloc对应一个相对应的r
e [w1 release];
    [u2 release];
    [u1 release];
    
    return 0;
</span><div style="text-align: left;"></div><span style="font-size:18px;">}</span>

    结论:

①无论什么@property,都要分析使用的石retain还是assign。这涉及到是否要重写set方法清空内存的。

②@property的参数一定要写全。并且全部都是nonatomic,剩下的就算是默认类型assign也是要写全的。

③一个alloc对应一个相应的release。转发博客就去找博客对象,思想要体现出面向对象。

④在没有学习arc之前,dealloc必须重写,在对象销毁时,所有使用到的OC对象都应该执行一次release。

(四)循环包含和循环retain:

1.循环包含:

当两个对象互相包含对方时候,会在两个.h文件中包含对方的.h,由于#import是单纯的拷贝,这样就会导致无线拷贝,出错。所以,当两个对

象的关系需要互相包含的时候,会在.h中互相@class对方的类。@class的意思是告诉编译器,这是一个类,这样下面的@property设置才不会

出错。但是@class的作用仅仅是声明这是一个类的对象。当真正用到里面东西的时候,还需要在.m文件中#import对方类。这样就实现了循环

包含。

①在.h中用@class声明。

②在.m中用#import包含。

③这样可以提高性能。因为import只是拷贝,如果它被很多人在.h文件include,但凡这个类有一点修改,剩下的全部都要重新改。

2.循环retain:

当设置好循环包含后,如果对象互相调用方法,会出现循环retain引用出错。会导致计数器不会归零。此时应该一端用retain,一端用assign单

纯存储。  

(五)autorelease:

    autorelease是一个对象方法,可以代替release。autorelease方法调用完毕后,会返回对象本身。并且不会影响对象本身计数器的增减。代

码表示为:

<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"><span style="font-size:18px;"> @autoreleasepool</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    {</span></span></div><div style="text-align: left;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">er *u = [[[User alloc] init] autorelease];</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">    u</span></div></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    U</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">s.name = @"shy";</span></span></div><div style="text-align: left;"></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    }</span></span></span></div>

当调用autorelease时,会把对象自动放到一个自动释放池中。自动释放是的创建是依靠@aotoreleasepool{}。在{开始表示创建,在}结束表

示销毁。销毁自动释放池可以让自动释放池中的所有对象做一次release方法(注意:不是直接销毁池子内的所有对象)。这样我们就避免了每

一次alloc都要迫不及待的打上一个与之相对应的release了。而是直接把分配好内存,初始化成功的对象进行一次autorelease操作,把对象放到

池子里半自动销毁就可以了。

总结:

①自动释放池:

自动释放池可以创建无数多个并且可以嵌套使用。它是存放在栈中的,这个栈和我们之前说的数据类型存放在内存中的堆,栈中的栈是不一样

的。这个栈是一个存储方式。遵循先进后出得原则。先存进来的最后释放,第一个创建的autoreleasepool是最后释放的,而它里面嵌套的释放

池先释放。

②atuorelease基本用法:

  • 会将对象放到自动释放池。
  • 自动释放池在第二个大括号结束时销毁,此时对所有池子中的对象做一次release操作。
  • autorelease是一个对象方法。返回对象本身。
  • autorelease的调用不影响计数器增加减少。影响计数器增加减少的只有retain和release。

③autorelease好处:

  • 不需要关系对象释放时间。不用在一个alloc对应一个release,并且时刻注意所有对对象的操作都必须在release前面。   

④autorelease的使用注意:
  • 占用内存较大的对象不要随便使用autorelease,autorelease只是延长了自动释放的时间,而不是自动销毁,但是无法精确的控制释放时间。所以开发时候一般使用release精确控制。
  • 占用内存较小的可以使用autorelease,没有太大影响。
  • 使用autorelease要需要有池子。并且每次调用都要放到栈顶。
⑤错误写法:
  • 一个alloc对应一个release或者autorelease,如果对应两个就会报错。

  • 连续多次调用autorelease也不对,一次autorelease会做一次release,多次调用会出现野指针错误。

⑥高级使用方法:


autorelease一般可以进行封装。封装在类方法中方便创建。

<div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"><span style="font-size:18px;">+ (id)perdon</span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">{</span></span></div><div style="text-align: left;"></div><div style="text-align: justify;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> return [[[Perdon alloc] init] autorelease];</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"></span><div style="text-align: justify;"><span style="font-size:18px;">}</span></div></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">  </span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> </span></span></div><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">+ (id)perdonWithAge:(int)age</span></span></div><span style="font-size:18px;"></span><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;">{</span></div>
<div style="text-align: justify;"><div style="text-align: justify;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">init] autorelease];</span></span></div><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">    p.age = age;
</span></span><div style="text-align: left;"></div>    return p;
<div style="text-align: left;"></div>}
</div><span style="font-size:18px;">    Perdon *p =  [[[Perdon alloc]
 
- (void)dealloc
{
    NSLog(@"Perdon---要死掉了");
    [super dealloc];
</span><div style="text-align: justify;"></div><span style="font-size:18px;">}</span></span>

  • 当系统自带的方法里没有alloc,copy,new时,说明返回值对象都是autorelease类型的。
  • 开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象。创建对象时不要直接用类名,尽量用self。这样子类也能用。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: tim_oc1init和tim_oc2init是STM32的定时器模块中的函数,用于初始化定时器的输出比较通道1和通道2。其中,tim_oc1init用于初始化通道1,tim_oc2init用于初始化通道2。这两个函数可以设置定时器的输出模式、极性、预分频器等参数,以满足不同的应用需求。 ### 回答2: tim_oc1init和tim_oc2init是两个函数,是在STM32开发中使用的定时器输出比较功能函数。 首先,我们需要了解一下定时器和定时器输出比较的概念。定时器是一种可编程、周期性的计时器,它能够在一定时间内产生定时中断或输出PWM信号。而定时器输出比较是指定时器对比较值进行比较,当定时器计数器计数值达到比较值时,定时器输出会发生变化。 tim_oc1init和tim_oc2init是用于设定定时器输出比较功能的函数,以tim_oc1init函数为例,它的具体功能包括: 1. 设定TIMx_CH1的输出模式和极性,可以选择PWM模式或脉冲模式,并可设定输出极性为正常或反转; 2. 设定比较值,即当计数器的值达到此值时触发输出; 3. 设定预分频系数和重载值,确定计时器的计数范围。 通过tim_oc1init和tim_oc2init函数的设定,可以实现定时器输出比较功能,可以控制各种电子设备的输出信号和开关控制,适用于各种行业的应用场景。在开发中,根据具体需求使用不同的输出模式和比较值,可以实现多种不同的功能操作。 ### 回答3: tim_oc1init和tim_oc2init是针对定时器的两个初始化函数。 首先,定时器是嵌入式系统中非常重要的一个模块,它可以通过计时和计数等方式实现各种定时和计时功能,比如控制LED灯闪烁、通过定时触发中断来完成一些任务等。 而tim_oc1init和tim_oc2init则是针对定时器的输出比较功能而设置的两个初始化函数,用于配置定时器的输出比较通道1和通道2。 对于tim_oc1init而言,它可以设置如下几个参数:定时器的指针、比较输出模式、预分频系数、占空比等。其中,比较输出模式有四种模式可供选择,分别为TIM_OCMode_Timing(定时模式)、TIM_OCMode_Active(有效电平模式)、TIM_OCMode_Inactive(无效电平模式)和TIM_OCMode_PWM1(脉冲宽度调制模式)。 而tim_oc2init则是针对定时器的输出比较通道2进行初始化,可以设置的参数与tim_oc1init相同,只不过它是控制通道2的输出状态。 需要注意的是,这两个函数都是基于STM32的定时器模块设计的,因此在使用它们时需要根据硬件平台来确定具体的实现方法和参数设置。 总的来说,tim_oc1init和tim_oc2init是非常重要的定时器初始化函数,可以方便地控制定时器的输出比较通道,从而实现各种自定义的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值