zoukankan      html  css  js  c++  java
  • 内存管理3- @property 参数详解

    @property

    -----------------

    Create two classes:

    Book & Student

    -------------------

    book.m

    #import "Book.h"

    #import "Card.h"

    @implementation Book

    -(void)dealloc{

    NSLog(@"Book is destroyed.");

    [super dealloc];

    }

    @end

    Student.h

    @class Book;

    @class Card;

    @interface Student:NSObject{

    //其实可以为空,get就默认就好了

    }

    @property Book *book;

    @property Card *card;

    @end

    Student.m

    @implementation

    -(void)setBook:(Book *)book{

    if(_book!=book){

    [_book release];

    _book=[book retain];

    }

    }

    -(void)setCard:(Card *)card{

    if(_card!=card){

    [_card release];

    _card=[card retain];

    }

    }

    //如果同时生成getter &setter method ,Xcode will not generate _book,if only have //getter ,it still generate.

    //get 方法 可以自己生成,开发工具自己生成很多函数不适合我们学习语法。Xcode 4.5

    -(void)dealloc{

    NSLog(@"Student object is destroyed.");

    [_book release];        //self.book=nil;

    [_card  release];        //self.card=nil;

    [super dealloc];

    }

    @end

    ---------------------------------------------

    Create the third class Card(ID Card)

    Card.h

    @implementation Card

    @end

    --------------------------------------------------------

    @property  是属性的意思  在Student中包含很多property book & card,他们结构相同,set方法也一模一样。所以引入@property的参数

    -----------------

    Student.h

    @property (retain) Book *book;//release 旧值,retain新值。

    @property (retain) Book *book;//可以理解为只要重复的太多了,Xcode都帮你写。

    相当于

    Student.m

    -(void)setBook:(Book *)book{

    if(_book!=book){

    [_book release];

    _book=[book retain];

    }

    }

    -(void)setCard:(Card *)card{

    if(_card!=card){

    [_card release];

    _card=[card retain];

    }

    }

    -----------------------------------------------

    Main.m

    #import "Student.h"

    #import "Book.h"

    main(){

    @autoreleasepool{

    Student *stu=[[Student alloc]init];

    Book *book=[[Book alloc]init];//1

    stu.book=book;//2

    NSLog(@"count=%zi",[book retainCount]);//z 无符号 count=2证明是否有retain旧值

    [book release];

    Book *book2=[[Book alloc]init];

    stu.book=book2;

    //先release再retain 在此设置断点,如果book被release则是先release前面的,retain新的。

    //可以打印,也可以下一步看在函数中执行的情况。

    [book2 release];

    [stu release];

    }

    return 0;

    }

    -------------------

    ==============================

    @property的其他参数:

    @property int age;   //(no parameter)create standard getter and setter method,

    //(retain )error

    //So if that is basic data type, u can add nothing or (assign)分配,赋值 默认就是assign

    //If that is an Object please add (retain),

    @property (retain)

     ===========================

    格式(@property的参数就是设置getter&setter方法的)

    @property(parameter1,parameter2)type,name;

    //参数可有可无

    eg.

    @property int age;

    @property(nonatomic,retain) UIButton* btn;

    参数主要分三类:

    读写属性readwrite/readonly   --------------->readonly @property (readonly) int age

                                               --------------->-(int)age;

    setter处理assign/retain/copy ---------------->copy 先release原来的值,再复制新的值。

    原子性atomic/nonatomic --------------------->

    @property 属性默认atomic,提供多线程安全

    在多线程环境下,原子操作是必要的。否则有可能引起错误的结果。

    加了atomic,setter/getter是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始指向setter情况,相当于函数头尾加了锁一样。(locked

    nonatomic 不用考虑线程安全问题。禁止多线程,变量保护,提高性能。不是不管多线程,就是不允许多线程。

    atomic是OC使用的一种线程保护技术,防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的。所以在iphone这种小型设备上,如果没有使用多线程之间的通讯编程,那么nonatomic是一个非常好的选择。

    如果不需要多线程支持的话,用nonatomic就够了,另外由于不涉及锁的操作,所以执行的时候快点。

    ----------------------------------------------------

    面试可能

    解释: @property (nonatomic,retain) Book *book;

    book 的setter&getter方法不用加锁(考虑线程安全问题),book的setter方法需要管理内存。

    ------------------------------------------------------

    @property (nonatomic) BOOL rich;

    main.m

    stu.rich=YES;

    BOOL rich=stu.isRich;

    //For above code

    @property (nonatomic,getter=isRich) BOOL rich;

    getter 是用来指定get方法的方法名。

  • 相关阅读:
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    JAVA面向对象详细总结
    父愁者联盟--需求规格说明书
    案例分析
    软件工程编程作业1
    构建之法观后提问
    第一次随笔——准备工作
  • 原文地址:https://www.cnblogs.com/yesihoang/p/4494532.html
Copyright © 2011-2022 走看看