object-c 内存管理机制的学习

1.内存的创建和释放

   让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:

//“ClassName”是任何你想写的类名,比如NSString  NSArray等一切随意
id testObject = [[ClassName alloc] init];
注: alloc 是object-c 中常用来申请内存块的方式

此时,对于对象“testObject”来说,他的引用计数就是1了,原因就是他调用了alloc来创建了一块只属于他的内存,这样对象的引用计数就得+1. 另外,Object-c中的另两个关键字retain和copy也会将对象的引用计数+1.根据Object-c的内存管理机制,我们在使用完“testObject”后,需要释放它。

[testObject release];

release后的对象,虽然已经释放,但是他的指针地址仍然存在,只是指向了一块已经释放且无用的内存,所以我们建议release后直接赋个nil来置空。

一般,如果我们能知道需要实现功能所涉及的“className”的具体类名,就不建议使用init方法去初始化,比如以下代码:

NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推荐)
NSString *strTest=[[NSString alloc] init];  (不推荐)

2.类方法和实例方法

简单来说,实例方法就是得有了具体实例(对象)后才能使用的方法,一般以减号形式作为方法的前缀来声明,比如API定义

-(id)initWithString:(NSString *)aString;

相比而言,类方法则无需具体对象,只需要类的名称即可调用,一般以加号形式作为方法的前缀来声明,比如API定义:

+(id)stringWithString:(NSString *)aString;

大可以将类方法理解为静态方法,类方法在对象还没创建出来之前已经有了。

3.属性关键字

@property (nonatomic, assign) int B;
@property (nonatomic, retain) id classObj;

可以看到关键之@property后的括号出现了四个特征性关键字:nonatomic , assign , retain , settet, 这些关键字直接告诉编译器后面的变量用何种方式来存取。

属性关键字使用范围释义是否时默认值小贴士
assign赋值方式不复制不保留,直接赋值YES

基本数据类型和本类不直接拥有的对象

retain赋值方式将新值保留一份赋覆盖原值NO大部分对象可使用
copy赋值方式将新值复制一份赋覆盖原值NO字符串选择性使用
readwrite读写权限生成getter和setter两个方法YES变量可读取可修改
readonly读写权限只生成getter方法NO变量只读不可修改
atomic原子性原子操作YES可以保留在多线程环境下,能安全的存取值
nonatomic原子性非原子操作NO不生成多线程同步内容
getter存取方法自定义取方法NO 
setter存取方法自定义赋值方法NO 

关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相对较大

如果是类的delegate,推荐使用assign关键字,原因是避免了retain的死循环造成的对象无法真正的释放

3.ARC新增关键字 

   ARC新增两个武功高强的左右护法:strong 和 weak

   strong的含义和retain相同,weak和assign相同,修饰完的属性变量用法也是完全没有改变,不过strong和weak只能修饰对象。

   

   苹果官方对于ARC机制中对象的内存引用规则:

    (1)任何对象,如果仍有持有者,就不会销毁

    (2)任何对象,已经没有任何持有者,即自动销毁

  持有者就是只想对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者

4.ARC机制的使用规则

   对于ARC机制的使用,苹果发布了几条重要的规则需要开发者遵守。单单看那些生搬硬套的东西难免生涩,根据开发经验将规则总结如下:

   (1)不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease,同理,@selector(retina),@selector(release)这些曲线救国的方法也不能调用。dealloc虽然能够重写,但是不能调用[super dealloc]之类的方法,CoreFoundation框架由于非从属cocoa框架,所以CFRetain和CFRelease仍然正常使用。

   (2)不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象

   (3)不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体

   (4)不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效

   (5)不得使用内存Zone,那些牵涉NSZone的方法都不得使用。

   (6)不得对一个属性变量的取值方法命名以new开头

   (7)outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。

   (8)Core Foundation不适合ARC,该创建的仍创建,该释放的仍释放。

转载于:https://www.cnblogs.com/haibosoft/p/3656290.html

jsf和jpa 期末大作业 <%@ page language="java" import="java.util.*,dao.*,entitybean.*" pageEncoding="utf-8"%> <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <f:view> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <style type="text/css"> </style> </head> <body > <div style="position:absolute; width:100%; height:100%; z-index:-1;background-color:#2894FF;background-repeat : no-repeat;background-size:90% 90%;opacity:1"> <img src="image/re2.jpg"> <h3>人事信息管理</h3> <p style="text-align:center"> <h:outputLink value="/faces/add.jsp">添加一条</h:outputLink> <h:form> <h:dataTable value="#{loginBean.persons}" var="person" border="5" cellpadding="5" cellspacing="2"> <h:column> <f:facet name="header"> <h:outputText id="headerText1" value="职工号"/> </f:facet> <h:outputText value="#{person.id}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText2" value="姓名"/> </f:facet> <h:outputText value="#{person.name}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText3" value="性别"/> </f:facet> <h:outputText value="#{person.gender}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText4" value="年龄"/> </f:facet> <h:outputText value="#{person.age}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText5" value="国籍"/> </f:facet> <h:outputText value="#{person.address_country}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText6" value="详细地址"/> </f:facet> <h:outputText value="#{person.address_detail}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText7" value="邮编"/> </f:facet> <h:outputText value="#{person.address_zip}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText8" value="入职时间"/> </f:facet> <h:outputText value="#{person.entry_time}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText9" value="所属部门"/> </f:facet> <h:outputText value="#{person.depertment}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText10" value="职位"/> </f:facet> <h:outputText value="#{person.position}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText11" value="工资"/> </f:facet> <h:outputText value="#{person.salary}"/> </h:column> <h:column> <h:outputLink value="faces/edit.jsp" > <h:outputText value="编辑"></h:outputText> <f:param name="p_id" value="#{person.id}"/> </h:outputLink> </h:column> <h:column> <h:outputLink value="delete.jsp" > <h:outputText value="删除"></h:outputText> <f:param name="p_id" value="#{person.id}"/> </h:outputLink> </h:column> </h:dataTable> </h:form> </p> <img src="image/re.jpg"> </div> </body> </html> </f:view>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值