码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员--oc基础第六篇

时间:2015-03-01 23:33:38      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

六. oc基础知识(内存管理下)

总结:内存管理代码规范

   1。只要调用alloc那么就必须调用release;

   2。set方法的代码部分

    *基本数据类型直接赋值。

    *如果是oc对象类型

      - (void) setCar:(Car *)car

      {

        if(_car!=car)

        {

          [_car release];

          _car=[Car retain];

         }

      }

    3.dealloc 部分的代码规范

      *一定要[super dealloc ]放在最后面。

      *对self(当前)所拥有的其他对象做一次release操作

        [_car release];

        [super dealloc]l;

    4.NSString *str=@"Jack" 这也是一个对象类型但是,它既没有用到alloc也没有用到retain随意不用对他进行release操作。

 

2.内存管理的相关参数:

*retain:适用于oc对象类型,引用计数器的值+1;

*assign:直接赋值(适用于普通数据类型)

*copy:release旧值retain新值。

*是否要生成set和get 方法

@property (readonly) int height;

这样就只会生成get方法而不产生set方法。

*readwrite 是可读可写类型,

*多线程管理

*nonatomic:当生成多线程代码的时候,不加锁(高性能)

*atomic:加锁,但是性能低下。

3.setter和getter方法的声明@property(getter=abc) int weight;

用来给set和get方法改名字的,这样就可以直接用abc方法来调用了

 

4.在非ARC下,用@property来声明变量,这样set方法release旧值,retain新值就不用自己写了,但是的dealloc,和主函数中的release还是省不了的。

 

5.在ARC形式时所有的retain,release。和retaincount,autoreleasepool都不能用了,所有的变量都用@property的形式声明就可以了。

 

6.当在非ARC时遇到release,如果引用计数器的值这时候正好变为0了,则立马跳到相应的dealloc方法中去,而不是执行完下面的代码才释放。

 

7.@class 的用法

@class 类名;仅仅告诉编译器这是一个类,下面可以创建Car累的对象,而不用担心由#import"Car.h",若是在Person类中用到car的对象,则在Person.m文件中再用#import”car.h“即可

总结:1.声明一个类仅仅是告诉编译器某个名称是一个类

   2.开发中引用一个类的规范。

   1>在.h文件中用@class来声明类

   2>在.m文件中用#import引用进来就行了,这也避免了循环引用

   3>两端循环引用的解决方案

    1.一端用retain,一端用assign(用assign是就不用在dealloc中release因为用的就是assign计数器是不会+1的 )

8.@class @import的区别

如果有上百个头文件#import了同一个文件,或者是这些文件一次被#import,那么一旦最开头的文件稍有改动,后面引用到的那个文件的所有类都需要重新编译一遍,这样的效力也是可想而知的,而相对来讲使用@class方式就不会楚翔这种问题。

 

#import <Foundation/Foundation.h>
@class Person;
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *per=[[Person alloc] init];
    }
    return 0;
}

 9.autorelease

autorelease 方法返回对象本身,可以取代release Person*per=[[[Person alloc] init] autorelease];

autorelease 会将对象放入到一个自动释放池中,当自动释放池被销毁时,会对池子里的所有对象做一次release操作(并不是池子被销毁则对象一定被销毁),只是引用计数器的值减去1而已。

 1 #import <Foundation/Foundation.h>
 2 @class Person;
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {//从大括号开始代表创建了一个池子
 5         
 6         Person *per=[[[Person alloc] init] autorelease];
 7         
 8     }//到大括号结束代表池子被销毁了。
 9     
10     return 0;
11 }

 

这个池子是以站的形式存在的(先进后出) ,池子是可以被创建无数多个的,缺点是:延迟了对象的释放时间,优点是不用再操心release。不必在担心野指针错误了。同时不能精确的控制对象的销毁时间了,对于大对象不要用autorelease。 

 

 

黑马程序员--oc基础第六篇

标签:

原文地址:http://www.cnblogs.com/keeganlee/p/4307708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!