内存管理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=证明是否有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 参数详解的更多相关文章
- OC语法7——内存管理之@property参数
@property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们 ...
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- 内存管理-MRC与ARC详解
Objective-C提供了两种内存管理机制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),为Objective-C提 ...
- tomcat内存配置及配置参数详解
1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟 ...
- Objective-C:@property参数详解
格式:@property(param1, param2) 类型 属性名 参数可有可无 三类参数: 1.读写属性:readwrite/readonly readwrite:产生setter\getter ...
- oracle内核参数详解
一.前言 在生产中,我们安装oracle数据库时,为达到最优我们需要对操作系统的内核参数进行一定的调整.主要从内存.cpu.io以及网络等方面,根据实际情况进行调整.以下参数可供大家参考,如有不当之处 ...
- 【转贴】内存重要参数详解 RAS CAS
内存重要参数详解 RAS CAS 分类: LINUX 2014-09-12 09:41:58 原文地址:内存重要参数详解 RAS CAS 作者:Reny http://blog.chinaunix.n ...
- JVM的参数详解(转)
12年毕业到先在处理第一年外这几年纯属于打酱油,当初自学Java然后就出来找工作了,还有第一家面试就通过了挺幸运的 但之后的这段时间一直是处于吃老本的状态.最近心情真的很不好,各种黄老邪!一直处于堕落 ...
- Lock_sga 和 pre_page_sga 参数详解
Lock_sga 和 pre_page_sga 参数详解 Lock_sga 和pre_page_sga,是两个平时用的不算太多的参数,但是这两个参数平时在优化的时候可能给你带来比较乐观的 ...
- 以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...
随机推荐
- VS App_Code文件夹下的类文件不能直接被调用的解决方法
如下图所示,新建的类不能直接使用,会显示报错,检查命名空间什么的,未果 通过百度搜索,发现这么一篇文章:https://blog.csdn.net/younghaiqing/article/detai ...
- ZROI17普及23-B星空题解--图的灵活转化
题目链接 版权原因不予提供 分析 这题思路很妙啊,虽然已经算半个套路题(因为我太菜了) 将框视为点,若一个球能放在\(x\)或\(y\)框,则\(x,y\)连一条无向边.有一条非常显然的性质是:在联通 ...
- Django rest-framework框架-content-type
表结构讨论: 是用一张表价格策略表来记录两种不同的价格策略 content-type原理: 使用一张表来记录不同课程的价目,增加一行表名称 注释: 适用于多张表关联一张表的情况 会自动生成这种的结构: ...
- Java代理模式示例程序
Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...
- 4、java基础:JDK8接口新特性以及接口和抽象类区别
在jdk8之前,interface之中可以定义变量和方法,变量必须是public.static.final的,方法必须是public.abstract的.由于这些修饰符都是默认的,所以在JDK8之前, ...
- stm32 printf重定向
printf函数调用fputc int fputc(int ch, FILE *p) { USART_SendData(USART1, ch); //重定向到串口 while(USART_GetFla ...
- 使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的
我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request ...
- Linux路径切换命令——directory stack
操作directory stack一共需要3个命令: dirs .pushd.popd dirs: 显示当前目录栈 pushd: 把目录压栈 popd: 把目录弹栈 dirs 显示目录栈内容,如果没有 ...
- 熟记这些python内置函数,你离大佬就不远了
python内置了很多函数,方便我们在写程序的时候调用,在ython 2.7 的所有内置函数共有80个.熟练记住和使用这些内置函数,将大大提高写Python代码的速度和代码的优雅程度. 以下代码示例用 ...
- jquery动态背景切换全屏登录插件supersized.js
下载地址:https://download.csdn.net/download/t101lian/10434198预览: http://www.daimabiji.com/codedemo/1530 ...