篇一:iOS Block界面反向传值
iOS Block界面反向传值
iOS KVO注册和监听方法 iOS tableView的增加,删除,刷新,更新的方法...
[文件] iic.h ~ 2KB
#ifndef __IIC_H__
#define __IIC_H__
#include "config.h"
#define ADDR_PASSWORD(0) //密码:2个字节
#define ADDR_COM_SET (2) //系统地址和波特率
#define ADDR_TRIP_TIME (16) //脱扣时间
#define ADDR_FAULT_RECORD (26) //故障记录存储地址
#define ADDR_PROTECT_SET(172)//故障报警值
[代码] [Google Go]代码
package main
import (
"io/ioutil"
"net/http"
"net/"
"fmt"
"encoding/json"
)
//----------------------------------
// 黄金数据调用示例代码 - 聚合数据
// 在线接口文档:www/docs/29
//----------------------------------
iOS lizbqrencode 导入报错
const APPKEY = "*******************" //您申请的APPKEY
iOS UICollectionView 基本创建使用...
func main(){
//1.上海黄金交易所
Request1()
//2.上海期货交易所
Request2()
//3.银行账户黄金
Request3()
}
//1.上海黄金交易所
func Request1(){
//请求地址
juhe :="/finance/gold/shgold"
//初始化参数
param:=.Values{}
//配置请求参数,方法内部已处理encode问题,中文参数可以直接传参 param.Set("key",APPKEY) //APP Key
param.Set("v","") //JSON格式版本(0或1)默认为0
//发送请求
data,err:=Get(juhe,param)
if err!=nil{
fmt.Errorf("请求失败,错误信息:\r\n%v",err)
}else{
var netReturn map[string]interface{}
json.Unmarshal(data,&netReturn)
if netReturn["error_code"].(float64)==0{
fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result"])}
}
}
//2.上海期货交易所
func Request2(){
//请求地址
juhe :=":8080/finance/gold/shfuture"
//初始化参数
param:=.Values{}
//配置请求参数,方法内部已处理encode问题,中文参数可以直接传参 param.Set("key",APPKEY) //APP Key
param.Set("v","") //JSON格式版本(0或1)默认为0
//发送请求
data,err:=Get(juhe,param)
if err!=nil{
fmt.Errorf("请求失败,错误信息:\r\n%v",err)
}else{
var netReturn map[string]interface{}
json.Unmarshal(data,&netReturn)
if netReturn["error_code"].(float64)==0{
fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result"])
}
}
}
//3.银行账户黄金
func Request3(){
//请求地址
juhe :=":8080/finance/gold/bankgold"
//初始化参数
param:=.Values{}
//配置请求参数,方法内部已处理encode问题,中文参数可以直接传参 param.Set("key",APPKEY) //APP Key
//发送请求
data,err:=Get(juhe,param)
if err!=nil{
fmt.Errorf("请求失败,错误信息:\r\n%v",err)
}else{
var netReturn map[string]interface{}
json.Unmarshal(data,&netReturn)
if netReturn["error_code"].(float64)==0{
fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result"])}
}
}
// get 网络请求
func Get(api string,params .Values)(rs[]byte ,err error){
var *.
,err=.Parse(api)
if err!=nil{
fmt.Printf("解析错误:\r\n%v",err)
return nil,err
}
//如果参数中有中文参数,这个方法会进行Encode
.RawQuery=params.Encode()
resp,err:=http.Get(.String())
if err!=nil{
fmt.Println("err:",err)
return nil,err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
// post 网络请求 ,params 是.Values类型
func Post(api string, params .Values)(rs[]byte,err error){
resp,err:=http.PostForm(api, params)
if err!=nil{
return nil ,err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
代码描述:基于GO的黄金数据接口调用代码实例
关联数据:黄金数据
[代码] [C#]代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using Xfrog.Net;
using System.Diagnostics;
using System.Web;
//----------------------------------
// 黄金数据调用示例代码 - 聚合数据
// 在线接口文档:www/docs/29
// 代码中JsonObject类下载地址:/download/gcm3206021155665/7458439 //----------------------------------
namespace ConsoleAPI
{
class Program
{
static void Main(string[] args)
{
string appkey = "*******************"; //配置您申请的appkey
//1.上海黄金交易所
string 1 = ":8080/finance/gold/shgold";
var parameters1 = new Dictionary<string, string>();
parameters1.Add("key", appkey);//你申请的key
parameters1.Add("v" , ""); //JSON格式版本(0或1)默认为0
string result1 = sendPost(1, parameters1, "get");
JsonObject newObj1 = new JsonObject(result1);
String errorCode1 = newObj1["error_code"].Value;
if (errorCode1 == "0")
{
Debug.WriteLine("成功");
Debug.WriteLine(newObj1);
}
else
{
//Debug.WriteLine("失败");
Debug.WriteLine(newObj1["error_code"].Value+":"+newObj1["reason"].Value); }
//2.上海期货交易所
string 2 = ":8080/finance/gold/shfuture";
var parameters2 = new Dictionary<string, string>();
parameters2.Add("key", appkey);//你申请的key
parameters2.Add("v" , ""); //JSON格式版本(0或1)默认为0
string result2 = sendPost(2, parameters2, "get");
JsonObject newObj2 = new JsonObject(result2);
String errorCode2 = newObj2["error_code"].Value;
if (errorCode2 == "0")
{
Debug.WriteLine("成功");
Debug.WriteLine(newObj2);
}
else
{
//Debug.WriteLine("失败");
篇二:block使用小结、在arc中使用block、如何防止循环引用
引言
使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: 【小测试】你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客。
Block简介(copy一段)
Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理 要么导致return cycle内存泄漏要么内存被提前释放导致crash。 Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。
可以这样理解,Block其实包含两个部分内容 1. Block执行的代码,这是在编译的时候已经生成好的;
2. 一个包含Block执行时需要的所有外部变量值的数据结构。 Block将使用到的、作用域附
近到的变量的值建立一份快照拷贝到栈上。
Block与函数另一个不同是,Block类似ObjC的对象,可以使用自动释放池管理内存(但Block并不完全等同于ObjC对象,后面将详细说明)。
Block基本语法
基本语法在本文就不赘述了,同学们自学。
Block的类型与内存管理
根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock
。 ?
?
? NSGlobalBlock:类似函数,位于text段; NSStackBlock:位于栈内存,函数返回后Block将无效; NSMallocBlock:位于堆内存。
1、NSGlobalBlock如下,我们可以通过是否引用外部变量识别,未引用外部变量即为NSGlobalBlock,可以当做函数使用。
1 {
2 NSArray *testArr = @[@"1", @"2"];
3
4 void (^TestBlock)(void) = ^{
5
6NSLog(@"testArr :%@", testArr);
7 };
8
9 NSLog(@"block is %@", ^{
10
NSLog(@"test Arr :%@", testArr); 11
12 });
//block is <__NSStackBlock__: 0xbfffdac0> 13
//打印可看出block是一个 NSStackBlock, 即在栈上, 当函数返回时block将无效 14
15
NSLog(@"block is %@", TestBlock); 16
//block is <__NSMallocBlock__: 0x75425a0> 17
//上面这句在非arc中打印是 NSStackBlock, 但是在arc中就是NSMallocBlock 18
//即在arc中默认会将block从栈复制到堆上,而在非arc中,则需要手动copy. 19
20 }
3、NSMallocBlock只需要对NSStackBlock进行copy操作就可以获取,但是retain操作就不行,会在下面说明
Block的copy、retain、release操作 (还是copy一段)
不同于NSObjec的copy、retain、release操作:
? Block_copy与copy等效,Block_release与release等效;
? 对Block不管是retain、copy、release都不会改变引用计数retainCount,retainCount始终是
1;
?
? NSGlobalBlock:retain、copy、release操作都无效; NSStackBlock:retain、release操作无效,必须注意的是,NSStackBlock在函数返回后,
Block内存将被回收。即使retain也没用。容易犯的错误是[[mutableAarry
addObject:stackBlock],(补:在arc中不用担心此问题,因为arc中会默认将实例化的block拷贝到堆上)在函数出栈后,从mutableAarry中取到的stackBlock已经被回收,变成了野指针。正确的做法是先将stackBlock copy到堆上,然后加入数组:[mutableAarry addObject:[[stackBlock copy] autorelease]]。支持copy,copy之后生成新的NSMallocBlock类型对象。
? NSMallocBlock支持retain、release,虽然retainCount始终是1,但内存管理器中仍然会增
加、减少计数。copy之后不会生成新的对象,只是增加了一次引用,类似retain;
? 尽量不要对Block使用retain操作。
Block对外部变量的存取管理
基本数据类型
1、局部变量
局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在
Block中的值。
2 static int base = 100;
3 long (^sum)(int, int) = ^ long (int a, int b) {
4base++;
5return base + a + b;
6 };
7
8 base = 0;
9 printf("%ld\n",sum(1,2));
// 这里输出是4,而不是103, 因为base
被设置为了0 10
printf("%d\n", base); 11
// 这里输出1, 因为sum中将base++了 12
13 }
3、__BLOCK修饰的变量
Block变量,被__block修饰的变量称作Block变量。 基本类型的Block变量等效于全局变量、或静态变量。
注:BLOCK被另一个BLOCK使用时,另一个BLOCK被COPY到堆上时,被使用的BLOCK也会被COPY。但作为参数的BLOCK是不会发生COPY的
OBJC对象
block对于objc对象的内存管理较为复杂,这里要分static global local block变量分析、还要分非arc和arc分析
非ARC中的变量
先看一段代码(非arc)
- (id) init { 10
if (self = [super init]) { 11
_instanceObj = [[NSObject alloc] init]; 12
13 }
return self; 14
15 }
16
- (void) test { 17
static NSObject* __staticObj = nil; 18
__globalObj = [[NSObject alloc] init]; 19
__staticObj = [[NSObject alloc] init]; 20
21
NSObject* localObj = [[NSObject alloc] init]; 22
__block NSObject* blockObj = [[NSObject alloc] init]; 23
24
typedef void (^MyBlock)(void) ; 25
26 MyBlock aBlock = ^{
NSLog(@"%@", __globalObj); 27
NSLog(@"%@", __staticObj); 28
NSLog(@"%@", _instanceObj); 29
NSLog(@"%@", localObj); 30
NSLog(@"%@", blockObj); 31
32 };
aBlock = [[aBlock copy] autorelease]; 33
34 aBlock();
35
NSLog(@"%d", [__globalObj retainCount]); 36
NSLog(@"%d", [__staticObj retainCount]); 37
NSLog(@"%d", [_instanceObj retainCount]); 38
NSLog(@"%d", [localObj retainCount]); 39
NSLog(@"%d", [blockObj retainCount]); 40
41 }
42 @end
篇三:Coding Block详解
SAP-Coding Block
大家都知道Coding Block是在ECC50之后版本里面比较好用的一个功能,可以把自定义的字段安装到FAGLFLEXT表中,当然通过一些增强程序还可以在统驭科目中使用。
1、Coding Block新字段
财务会计(新)-财务会计基本设置(新)-分类帐-字段-客户字段-编辑编码块(OXK3); 添加字段【如图1】;该步骤比较耗时,完成后,可查看客户化字段已经创建;
2、安装新字段到新总账汇总表FAGLFLEXT中
财务会计(新)-财务会计基本设置(新)-分类帐-字段-客户字段-包括总计表中的字段(FAGL_GINS);输入表FAGLFLEXT,修改进入,将自定义字段加入,保存并激活; 该步骤耗时,完成后退出,在初始界面激活汇总表; 使用SE16,检查表FAGLFLEXT和BSEG,发现字段ZZFI已经加入了;新增补的字段需要更改其记账码和字段状态组的字段状态(可使用事务码:FBKP),才能正常显示和输入,系统默认的状态是为“隐藏”。注意维护的语言,否则可能看不到字段名;
3、为Coding Block新字段定义凭证输入的子屏幕为了使新增补的字段能在凭证输入时比较方便的输入,使新增的字段能出现在事务OXK3的屏幕中:发票/贷项发票快速输入、总账快速输入、科目分配和预制凭证等;
财务会计(新)-财务会计基本设置(新)-分类帐-字段-客户字段-编辑编码块(OXK3);
选择菜单“环境”,“预备快速输入”进入新的屏幕;执行完成后,即可在FB50,F-02的屏幕中看到新增字段;可以通过维护自定义屏幕变式和自定义子屏幕来设置字段出现的位置,路径如下:财务会计(新)-总账会计核算(新)-业务交易-总账会计过帐-满意-在Enjoy事务中包括客户字段;财务会计(新)-财务会计基本设置(新)-分类帐-字段-为编码块定义子屏幕(OXK1);
4、为Coding Block新字段维护数据表内容
保存后激活;然后可以使用事务SE16直接维护数据表ZZFI_BB的内容; 但对于一般的最终用户来说不会被分配访问数据表的操作权限,因此需要开发人员编写一段ABAP程序以使最终用户能简单方便的维护数据表内容;
5、定义Coding Block新字段的搜索帮助
为了在数据输入时方面的选择输入其数据值(F4),需要为新增补的字段创建搜索帮助;使用事务SE11创建搜索帮助;点击创建,选择“基本索引帮助”,进入创建搜索帮助界面;保存并激活;
6、分配搜索帮助给Coding Block新字段
使用事务SE11将创建号的搜索帮助分配给新增补字段;保存并激活;
7、分配数据检查表给Coding Block新字段
使用事务SE11修改结构CI_COBL;点修改进入,选中所需要维护的组件ZZFI,点 ,进入搜索帮助及检查视图;点击 按钮选择“外来码”,系统弹出对话框“外来关键词不存在,创建带值表ZZFI_BB的建议作为检查表格?”,选择“是”,接受系统建议;选择“复制”复制外来码关键字检查表ZZFI_BB;此时可以看到ZZFI_BB已经填入到CheckTable中了;
8、把方案和客户字段分配到分类帐
财务会计(新)-财务会计基本设置(新)-分类帐-分类帐-把方案和客户字段分配到分类帐 将客户字段ZZFI添加到分类帐OL中,这样表FAGLFLEXT中,就能对字段ZZFI产生一条汇总记录;经过这样设置,可以查询查询针对ZZFI的期初、发生、期末的数据了;