黑马程序员————OC内存管理_笔记整理(二)

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、@Prpperty参数

// 加上retain:表示生成的set方法,release旧值,retain新值
@property (retain) Book *book;
// oc对象类型
//@property (nonatomic,retain) 类名 *属性名;
@property (nonatomic,retain)Car *car;
@property (nonatomic,retain)id car;

//非oc对象(类型名称 属性名)
@property (nonatomic,assign) int age;

1.Set方法内存管理相关的参数
1)retain:release旧值,retain新值(适用于oc对象)
2)assign:直接赋值(默认,适用于非oc对象类型)
3)copy:release旧值,copy新值(一般用于NSString*)

2.是否要生成Set方法

1)readwrite:同时生成setter和gett的声明和实现(默认)
2)readonly:只会生成getter的声明和实现

3.多线程管理(编程最为复杂)

1)nonatomic :性能高,一般就用这个
2)atomic:性能低,默认

4.setter和getter方法的名称
1)setter:决定了set方法的名称,一定要有个冒号
2)getter:决定了get方法名称(一般用在BOOL类型的get方法)

二、 循环引用

1.@class的作用

仅仅只是告诉编译器,某个名称只是一个类

// @class仅仅是告诉编译器,Person只是一个类
@class Person;

@interface Person : NSObject

@property (nonatomic,retain) Person *person;

@end


2.开发中引用一个类的规范
在.h文件中用@class来声明类
在.m文件中用#import来包含

3.两端循环引用retain的解决方案
一端用retain,另一段用assign

三、autorelease方法(半自动释放)
    
    Person *p = [[[Person alloc] init] autorelease];
    
    // 不需要在调用release方法
    //[p release];
    p.age = 10;

1.autorelease的基本用法
1)会将对象放到一个自动释放池中
2)当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3)会返回对象本身
4)调用完autorelease方法后,对象的计数器不变


2.autorelease的好处
1)不用在关心对象释放的时间
2)不用在关心什么时候调用release

3.使用注意
1)占用内存较大的对象不要随便使用autorelease
2)占用内存较小的对象使用autorelease没有太大影响

4.错误写法
1)第一种
int main() {
    
    @autoreleasepool {
        
        // alloc之后调用了autorelease,又调用release
        Person *p = [[[Person alloc] init] autorelease];
        
        // 错误写法
        [p release];
    }
    return 0;
}
2)第二种
int main() {
    
    // 连续多次调用autorelease
    @autoreleasepool {
        
        // 错误写法
        Person *p = [[[[Person alloc] init] autorelease] autorelease];
        
           }
    return 0;
}

5.自动释放池
1)在ios程序运行过程中,会创建无数个池子,这些池子都是以栈结构存在(先进先出)
2)当一个对象调用autorelease方法时,会将这个对象放到栈顶得释放池

6.自动释放池的创建方式
1)iOS  5.0以前
    
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    [pool release];
    //[pool drain];

2)iOS 5.0以后
int main() {

    @autoreleasepool {
        
        
        
    }
    return 0;
}

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

你可能感兴趣的:(黑马程序员————OC内存管理_笔记整理(二))