@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=证明是否有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方法的方法名。

内存管理3- @property 参数详解的更多相关文章

  1. OC语法7——内存管理之@property参数

    @property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们 ...

  2. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  3. 内存管理-MRC与ARC详解

    Objective-C提供了两种内存管理机制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),为Objective-C提 ...

  4. tomcat内存配置及配置参数详解

    1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟 ...

  5. Objective-C:@property参数详解

    格式:@property(param1, param2) 类型 属性名 参数可有可无 三类参数: 1.读写属性:readwrite/readonly readwrite:产生setter\getter ...

  6. oracle内核参数详解

    一.前言 在生产中,我们安装oracle数据库时,为达到最优我们需要对操作系统的内核参数进行一定的调整.主要从内存.cpu.io以及网络等方面,根据实际情况进行调整.以下参数可供大家参考,如有不当之处 ...

  7. 【转贴】内存重要参数详解 RAS CAS

    内存重要参数详解 RAS CAS 分类: LINUX 2014-09-12 09:41:58 原文地址:内存重要参数详解 RAS CAS 作者:Reny http://blog.chinaunix.n ...

  8. JVM的参数详解(转)

    12年毕业到先在处理第一年外这几年纯属于打酱油,当初自学Java然后就出来找工作了,还有第一家面试就通过了挺幸运的 但之后的这段时间一直是处于吃老本的状态.最近心情真的很不好,各种黄老邪!一直处于堕落 ...

  9. Lock_sga 和 pre_page_sga 参数详解

    Lock_sga 和 pre_page_sga 参数详解        Lock_sga 和pre_page_sga,是两个平时用的不算太多的参数,但是这两个参数平时在优化的时候可能给你带来比较乐观的 ...

  10. 以太坊客户端Geth命令用法-参数详解

    Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...

随机推荐

  1. substr函数索引创建测试

    技术群里小伙伴,沟通说一条经常查询的SQL缓慢,单表SQL一个列作为条件,列是int数值类型,索引类型默认创建. 一.SQL文本substr函数索引创建测试 ,) nm1 ')需求,将上述SQL执行速 ...

  2. SOAP-1概述

    简单对象访问协议 SOAP(简单对象访问协议)一般指简单对象访问协议 简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WE ...

  3. opencv中自适应阈值函数的实现(c++)

    根据<面向飞机蒙皮接缝的线结构光检测技术研究_张卡>论文中的原理,编写了自适应阈值函数 原理: //计算灰度最大最小值 void MaxGrayValue(Mat image,int &a ...

  4. JAVA文件IO总结

    文件流的操作有两种:字节流.字符流 字节流:FileInputStream,FileInputStream 字符流:InputStreamReader,OutputStreamReader 这两种流对 ...

  5. 关于H5的一些相关基础知识

    HTML只是简写全写是(Hyper Text  Markup Language)表示的是:超文本标记语言; HTML5表示的是html的第5次重大修改的第5个版本,(而html5是W3C和WHATWG ...

  6. react中key值的理解

    react利用key来识别组件,它是一种身份标识标识,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建有了key属性后,就可以与组件建立了一种对应关系,react根据 ...

  7. 使用NSFileManager管理文件系统

    文件系统作为被所有进程使用的基本资源之一,在macOS和iOS中主要用于处理数据文件.应用程序以及与操作系统自身相关的持久存储. iOS中的文件系统格式为HFS Plus,macOS中的主要格式也是H ...

  8. Linux学习笔记(十一)shell基础:管道符、通配符和其他特殊符号

    一.多命令顺序执行 && || 相当于其他高级语言中的 ? : 二.管道符 [命令1] | [命令2] 命令1的正确输出作为命令2的操作对象 分屏显示结果 netstat -an 命令 ...

  9. python基本应用--三元应用

    格式为:result=值1 if 条件 else 值2 如 a,b,c = 1,3,5 d =a if a>b else c 那么d的结果是多少? 其实可以使用if来完全表达 if a>b ...

  10. glPixelStorei 详解 包括像素传输

    3.glPixelStore 像glPixelStorei(GL_PACK_ALIGNMENT, 1)这样的调用,通常会用于像素传输(PACK/UNPACK)的场合.尤其是导入纹理(glTexImag ...