当前位置:  编程技术>移动开发
本页文章导读:
    ▪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动态代理就不会出现问题
    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
   又学了一招,很好很强大。。。接着要好好研究一下JDK动态代理和CGLIB代理(cglib.jar和asm.jar)

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3