当前位置: 编程技术>移动开发
本页文章导读:
▪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)
最新技术文章: