当前位置: 编程技术>移动开发
本页文章导读:
▪Objective-C对象初始化跟新特性 Objective-C对象初始化和新特性
一。对象初始化
两种创建对象的方法:a.[类名 new];b.[[类名 alloc] init];
这两种方法是等价的,不过通常的Cocoa惯例是使用b方法,而不是用a方法。
1.编写初始化.........
▪ 同步报表异步表格 同步表格异步表格
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYP.........
▪ 关于Spring事务代理类型转换有关问题($ProxyXX cannot be cast to 类型)( 关于Spring事务代理类型转换问题($ProxyXX cannot be cast to 类型)(
二、
后来在网上搜了一下,这样的问题很多,但是正真的并不多。参考http://mopishv0.blog.163.com/blog/static/54455932200911118572079.........
[1]Objective-C对象初始化跟新特性
来源: 互联网 发布时间: 2014-02-18
Objective-C对象初始化和新特性
一。对象初始化
两种创建对象的方法:a.[类名 new];b.[[类名 alloc] init];
这两种方法是等价的,不过通常的Cocoa惯例是使用b方法,而不是用a方法。
1.编写初始化方法
- (id) init{ /*实例变量所在的内存位置到隐藏的self参数之间的距离是固定的, *如果从init方法返回一个新对象,则需要更新self,以便其后的任何实例变量的引用可以被映射到正确的内存位置 *初始化时init返回值为nil,表明未能初始化对象,那么if方法体内的代码不会执行, *像这样将赋值和检查非零值合并起来是一种典型的C风格的方法。 */ if(self = [super init]){ engine = [Engine new]; tires[0] = [Tire new] } return self; }//init
2.清理Car类
//使用NSMutableArray来代替Car类中常规的C数组 #import <Cocoa/Cocoa.h> @class Tire; @class Engine; @interface Car:Object{ NSMultableArray *tires; Engine *engine; } - (void) setEngine: (Engine *)newEngine; -(Engine *) engine; - (void) setTire: (Tire *) tire atIndex: (int) index; - (Tire *) tireAtIndex: (int) index; - (void) print; @end //Car
同时修改Car类的每一个方法
- (id) init{ if(self = [super init]){ tires = [[NSMutableArray alloc] init]; int i; for(i=0;i<4;i++){ [tires addObject:[NSNull null]]; } } return (self); }
创建NSMultableArray,
a.用replaceObjectAtIndex:withObject:代替setTire:atIndex:
(原理是NSMutableArray数组不包含任何内容,使用了NSNull类的对象作为占位符,一般情况下不需要使用NSNull类对象预置NSMutalbeArray数组)
- (void) setTire: (Tire *) tire atIndex: (int) index { [tires replaceObjecAtIndex: index withObject:tire] }//setTire:atIndex:
b.用数组提供的objectAtIndex:方法代替getter方法tireAtIndex:从中获取tire对象
- (Tire *) tireAtIndex:(int) index{ Tire *tire; tire = [tires objectAtIndex: index]; return (tire); }
最后仍要确保对象的清理
- (void) dealloc{ [tire release]; [engine release]; [super dealloc]; }//dealloc
3.构造便利初始化函数
@interface Tire:NSObject { float pressure; float treadDepth; } - (id) initWithPressure: (float) pressure treadDepth: (float) treadDepth; - (void) setPressure: (float) pressure; - (float) pressure; - (void) setTreadDepth: (float) treadDepth; - (fload) treadDepth; @end //Tire
初始化函数更易阅读,减少代码量
- (id) initWithPressure: (float) p
treadDepth: (float) td{ if(self = [super init]){ pressure = p; treadDepth = td; } return (self); }//initWithPressure:treadDepth
可做如下调用
Tire *tire; tire = [[Tire alloc] initWithPressure: 23 treadDepth:33];
4.当有多个初始化函数时,对子类进行实例化容易发生调用错误,所以需要指定初始化函数,然后在其他的初始化函数中调用指定的初始化函数。
- (id) init { if (self = [self initWithPressure:34 treadDepth:20]){ } return (self); }//init - (id) initWithPressure: (float) p { if(self = [self initWithPressure:p treadDepth:20.0]){ } return (self); }//initWithPressure
二 特性
此Objective-C2.0特性只适用于Mac OS X 10.5(Leopard)或更高版本。
1.简化接口
#import <Foundation/Foundation.h> #import "Tire.h" @interface Tire:NSObject { float pressure; float treadDepth; } - (void) setPressure: (float) pressure; - (float) pressure; - (void) setTreadDepth: (float) treadDepth; - (fload) treadDepth; @end //Tire
简化如下#import <Foundation/Foundation.h>
#import "Tire.h" @interface Tire:NSObject { float pressure; float treadDepth; } @property float pressure; @property float treadDepth; @end // Tire;
@property预编译指令的作用是自动声明属性的setter和getter方法。
2.简化实现
@impletation Tire - (void) setPressure: (float) p{ pressure = p; }//setPressure - (void) pressure{ return (pressure); }//setPressure @end //Tire 简化如下 @impletation Tire @synthesize pressure; @end //Tire
@synthesize也是一种新的编译器功能,表示"创建该属性的访问器"。
3.特性扩展
a.读写特性(生成setter和getter方法)
@property (readwrite,copy) NSString *name; @property (readwrite,retain) Engine *engine;
b.只读特性(getter方法)
@property (readonly) float size;
[2] 同步报表异步表格
来源: 互联网 发布时间: 2014-02-18
同步表格异步表格
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>作者列表</title> <link href="/blog_article/${pageContext.request.contextPath}/css/table.css" rel="stylesheet" type="text/css"/> <link href="/blog_article/${pageContext.request.contextPath}/css/jquery.loadmask.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="/blog_article/${pageContext.request.contextPath}/js/jquery/jquery-1.8.1.min.js"></script> <script type="text/javascript" src="/blog_article/${pageContext.request.contextPath}/js/jquery/jquery.cookie.js"></script> <script language="javascript" src="/blog_article/${pageContext.request.contextPath}/js/com.js"></script> <script type="text/javascript" src="/blog_article/${pageContext.request.contextPath}/js/jquery.loadmask.js"></script> </head> <body> <br> <table cellpadding="0" cellspacing="1" align="center"> <caption> 作者列表 <span >说明:同步方式加载 </span> </caption> <tr> <th>ID</th> <th>名称</th> <th>简介</th> <th>类型</th> <th>keyword</th> <th>description</th> <th>创建时间</th> </tr> <c:forEach var="item" items="${list}" varStatus="status"> <tr> <td >${item.id}</td> <td>${item.name}</td> <td>${item.brief}</td> <td>${item.type}</td> <td>${item.keyWord}</td> <td>${item.description}</td> <td ><fmt:formatDate value="${item.timeCreate}" pattern="yyyy-MM-dd HH:mm:ss"/></td> </tr> </c:forEach> </table> <br> <table id="ajaxTable" cellpadding="0" cellspacing="1" align="center"> <caption> 作者列表 <span >说明:异步方式加载 </span> </caption> <tr> <th>ID</th> <th>名称</th> <th>简介</th> <th>类型</th> <th>keyword</th> <th>description</th> <th>创建时间</th> </tr> <c:forEach var="item" items="${list}" varStatus="status"> <tr> <td >${item.id}</td> <td>${item.name}</td> <td>${item.brief}</td> <td>${item.type}</td> <td>${item.keyWord}</td> <td>${item.description}</td> <td ><fmt:formatDate value="${item.timeCreate}" pattern="yyyy-MM-dd HH:mm:ss"/></td> </tr> </c:forEach> </table> <script type="text/javascript"> $(document).ready(function() { $.ajax({ url : "/bms/bauthor_list_ajax.tbao" , type : "post", data : { prodId : 0 }, beforeSend : function() { $('#ajaxTable').mask("正在提交数据,请稍候。"); }, success : function(responseObj, statusText, xhr) { var tableObj = document.getElementById('ajaxTable'); //清除表格中原有数据 var rowLength = tableObj.rows.length; for (var i = 1; i < rowLength; i++) { tableObj.deleteRow(1); } //添加新的数据 for (var i = 0; i < responseObj.length; i++) { var rowData = responseObj[i]; var newRow = tableObj.insertRow(tableObj.rows.length); var cell_0 = newRow.insertCell(0); var cell_1 = newRow.insertCell(1); var cell_2 = newRow.insertCell(2); var cell_3 = newRow.insertCell(3); var cell_4 = newRow.insertCell(4); var cell_5 = newRow.insertCell(5); var cell_6 = newRow.insertCell(6); cell_0.innerHTML = rowData["id"]; cell_1.innerHTML = rowData["name"]; cell_2.innerHTML = rowData["brief"]; cell_3.innerHTML = rowData["type"] ? rowData["type"] : ''; cell_4.innerHTML = rowData["keyWord"] ? rowData["keyWord"] : ''; cell_5.innerHTML = rowData["description"] ? rowData["description"] : ''; cell_6.innerHTML = rowData["timeCreate"]; } $(".tableList tr:odd").css("background-color", "#F2F9FF"); $(".tableList tr:even").css("background-color", "#E8F2FA"); $('#ajaxTable').unmask(); } }); }); </script> </body> </html>
[3] 关于Spring事务代理类型转换有关问题($ProxyXX cannot be cast to 类型)(
来源: 互联网 发布时间: 2014-02-18
关于Spring事务代理类型转换问题($ProxyXX cannot be cast to 类型)(
二、
后来在网上搜了一下,这样的问题很多,但是正真的并不多。参考http://mopishv0.blog.163.com/blog/static/54455932200911118572079写道
spring的文档中这么写的:Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。使用beanNameAutoProxyCreator来进行事务代理的话,他的proxyTargetClass这个属性设置为false(默认是false),即使用JDK动态代理,如果你的service类没有实现接口的话,就会报类型转换错误。
解决办法有:
1、给service类添加一个接口iService,让service类实现它,则创建代理类时使用JDK动态代理就不会出现问题
1、给service类添加一个接口iService,让service类实现它,则创建代理类时使用JDK动态代理就不会出现问题
2、设置beanNameAutoProxyCreator的proxyTargetClass属性为true,意思是强制使用CGLIB代理,前提是你已经将CGLIB包加入到项目中
推敲了很长时间,因为之前Spring事务用到的并不多,所以不是很了解。
第一种方法修改UserDao类也实现IDAO接口,但是没有解决。照样报错....
于是使用了第二种方案,修改了Spring事物配置信息,在原有的配置下加了一句配置如下:
<!-- 配置事务操作 -->
<bean id="transactionManager" >
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transactionmanager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" read-only="false" propagation="SUPPORTS" />
<tx:method name="select*" read-only="false" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="point" expression="execution(* com.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="point" />
</aop:config>
<!-- 注意下面的配置 -->
<aop:aspectj-autoproxy proxy-target-/>
注意:最后一行配置信息。
这样之后就解决了,而且测试结果如下:
INFO [STDOUT] com.dao.UserDao@13ba812
INFO [STDOUT] true
INFO [STDOUT] true
INFO [STDOUT] true
INFO [STDOUT] true
INFO [STDOUT] true
INFO [STDOUT] true
又学了一招,很好很强大。。。接着要好好研究一下JDK动态代理和CGLIB代理(cglib.jar和asm.jar)
最新技术文章: