当前位置: 编程技术>移动开发
本页文章导读:
▪objective-c的属性声明有关问题“ivar used by '@synthesize' declaration must be an existing iva” objective-c的属性声明问题“ivar used by '@synthesize' declaration must be an existing iva”在GNU环境中,测试一段objective-c的代码。很简单一个数据类,定义了一些属性和一个初始化方法,如下所示:
#impo.........
▪ 打包抓取网页信息的实例 封装抓取网页信息的实例......
▪ 向微信发送讯息 向微信发送消息
应用只需要进行一次注册就行了,然后在以后的使用中只需要封装消息,让通信类
发送即可。从前面的类图中可以看到,封装消息的顺序是首先生成需要发送的媒体
对象,.........
[1]objective-c的属性声明有关问题“ivar used by '@synthesize' declaration must be an existing iva”
来源: 互联网 发布时间: 2014-02-18
objective-c的属性声明问题“ivar used by '@synthesize' declaration must be an existing iva”
在GNU环境中,测试一段objective-c的代码。很简单一个数据类,定义了一些属性和一个初始化方法,如下所示:
#import <Foundation/Foundation.h>
@interface CtripSign:NSObject
@property (nonatomic,copy) NSString * allianceID;
@property (nonatomic,copy) NSString * apiKey;
@property (nonatomic,copy) NSString * siteID;
@property (nonatomic,copy) NSNumber * timestamp;
@property (nonatomic,copy) NSString * requestType;
@property (nonatomic,copy) NSString * sign;
-(id)initWithallicanceID:(NSString *)allianceID apiKey:(NSString *)apiKey siteID:(NSString *)siteID timestamp:(NSNumber *) timestamp requestType: (NSString *) requestType;
@end
#import "CtripSign.h"
#import "CtripDefine.h"
#import "NSString+Exts.h"
@implementation CtripSign
@synthesize allianceID=_allianceID;
@synthesize apiKey=_apiKey;
@synthesize siteID=_siteID;
@synthesize timestamp=_timestamp;
@synthesize requestType=_requestType;
@synthesize sign=_sign;
-(id)initWithallicanceID:(NSString *)allianceID apiKey:(NSString *)apiKey siteID:(NSString *)siteID timestamp:(NSNumber *) timestamp requestType: (NSString *) requestType
{
self = [super init];
if (self) {
_allianceID = allianceID;
_apiKey = apiKey;
_siteID = siteID;
long long int timeStampNum=0;
if (timestamp == nil)
{
// NSTimeInterval is defined as double
timeStampNum = (long long int)[[NSDate date] timeIntervalSince1970];
_timestamp=[NSNumber numberWithLongLong:timeStampNum];
}
else
{
_timestamp=timestamp;
}
_requestType=requestType;
NSString *timestampStr= [NSString stringWithFormat:@"%lld",timeStampNum];
NSString *signatureCtrip=[timestampStr stringByAppendingString:allianceID];
signatureCtrip=[signatureCtrip stringByAppendingString:[[_apiKey md5] uppercaseString]];
signatureCtrip=[signatureCtrip stringByAppendingString:_siteID];
signatureCtrip=[signatureCtrip stringByAppendingString:_requestType];
signatureCtrip=[signatureCtrip md5];
signatureCtrip=[signatureCtrip uppercaseString];
_sign=signatureCtrip;
return self;
}
return nil;
}
@end
这个类,我在apple机器上xcode4.5上调试是可以通过的,但是在gnu上调试却不行,报错如下:
E:\GNUStep\stanford2013\ctrip\CtripSign.m|16|error: ivar 'allianceID' used by '@synthesize' declaration must be an existing ivar|
我想,或许是版本问题,这个错误是说应该在CtripSign.h文件中应先添加变量声明。于是将CtripSign.h修改成这样
@interface CtripSign:NSObject
{
@property (nonatomic,copy) NSString * allianceID;
@property (nonatomic,copy) NSString * apiKey;
@property (nonatomic,copy) NSString * siteID;
@property (nonatomic,copy) NSNumber * timestamp;
@property (nonatomic,copy) NSString * requestType;
@property (nonatomic,copy) NSString * sign;
}
@property (nonatomic,copy) NSString * allianceID;
...........
@end
再编译,还是不过。后来想起来变量名称应该是以下划线开始,这才是类的私有变量的声明方式,而且我在类实现代码中就是这样调用的,如_allianceID
后来google到网友HoNooD的一文http://blog.csdn.net/g5dsk/article/details/6623099
他给出的解释是这样。
1、在 32-bit 时,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有相应的 @synthesize,则会得到类似下面的编译错误:
Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar
2、在 64-bit时,运行时系统会自动给类添加 ivar,添加的 ivar 以一个下划线"_"做前缀。
上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
我在xcode 4.5上编辑没问题,但在gnu上编译出错。前者是64-bit,而后者是一个PC机,32-bit。
在GNU环境中,测试一段objective-c的代码。很简单一个数据类,定义了一些属性和一个初始化方法,如下所示:
#import <Foundation/Foundation.h>
@interface CtripSign:NSObject
@property (nonatomic,copy) NSString * allianceID;
@property (nonatomic,copy) NSString * apiKey;
@property (nonatomic,copy) NSString * siteID;
@property (nonatomic,copy) NSNumber * timestamp;
@property (nonatomic,copy) NSString * requestType;
@property (nonatomic,copy) NSString * sign;
-(id)initWithallicanceID:(NSString *)allianceID apiKey:(NSString *)apiKey siteID:(NSString *)siteID timestamp:(NSNumber *) timestamp requestType: (NSString *) requestType;
@end
#import "CtripSign.h"
#import "CtripDefine.h"
#import "NSString+Exts.h"
@implementation CtripSign
@synthesize allianceID=_allianceID;
@synthesize apiKey=_apiKey;
@synthesize siteID=_siteID;
@synthesize timestamp=_timestamp;
@synthesize requestType=_requestType;
@synthesize sign=_sign;
-(id)initWithallicanceID:(NSString *)allianceID apiKey:(NSString *)apiKey siteID:(NSString *)siteID timestamp:(NSNumber *) timestamp requestType: (NSString *) requestType
{
self = [super init];
if (self) {
_allianceID = allianceID;
_apiKey = apiKey;
_siteID = siteID;
long long int timeStampNum=0;
if (timestamp == nil)
{
// NSTimeInterval is defined as double
timeStampNum = (long long int)[[NSDate date] timeIntervalSince1970];
_timestamp=[NSNumber numberWithLongLong:timeStampNum];
}
else
{
_timestamp=timestamp;
}
_requestType=requestType;
NSString *timestampStr= [NSString stringWithFormat:@"%lld",timeStampNum];
NSString *signatureCtrip=[timestampStr stringByAppendingString:allianceID];
signatureCtrip=[signatureCtrip stringByAppendingString:[[_apiKey md5] uppercaseString]];
signatureCtrip=[signatureCtrip stringByAppendingString:_siteID];
signatureCtrip=[signatureCtrip stringByAppendingString:_requestType];
signatureCtrip=[signatureCtrip md5];
signatureCtrip=[signatureCtrip uppercaseString];
_sign=signatureCtrip;
return self;
}
return nil;
}
@end
这个类,我在apple机器上xcode4.5上调试是可以通过的,但是在gnu上调试却不行,报错如下:
E:\GNUStep\stanford2013\ctrip\CtripSign.m|16|error: ivar 'allianceID' used by '@synthesize' declaration must be an existing ivar|
我想,或许是版本问题,这个错误是说应该在CtripSign.h文件中应先添加变量声明。于是将CtripSign.h修改成这样
@interface CtripSign:NSObject
{
@property (nonatomic,copy) NSString * allianceID;
@property (nonatomic,copy) NSString * apiKey;
@property (nonatomic,copy) NSString * siteID;
@property (nonatomic,copy) NSNumber * timestamp;
@property (nonatomic,copy) NSString * requestType;
@property (nonatomic,copy) NSString * sign;
}
@property (nonatomic,copy) NSString * allianceID;
...........
@end
再编译,还是不过。后来想起来变量名称应该是以下划线开始,这才是类的私有变量的声明方式,而且我在类实现代码中就是这样调用的,如_allianceID
后来google到网友HoNooD的一文http://blog.csdn.net/g5dsk/article/details/6623099
他给出的解释是这样。
1、在 32-bit 时,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有相应的 @synthesize,则会得到类似下面的编译错误:
Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar
2、在 64-bit时,运行时系统会自动给类添加 ivar,添加的 ivar 以一个下划线"_"做前缀。
上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
我在xcode 4.5上编辑没问题,但在gnu上编译出错。前者是64-bit,而后者是一个PC机,32-bit。
[2] 打包抓取网页信息的实例
来源: 互联网 发布时间: 2014-02-18
封装抓取网页信息的实例
package cn.mypic;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GetContentPicture {
//得到了图片地址并下载图片
public void getHtmlPicture(String httpUrl) {
URL url;
BufferedInputStream in;
FileOutputStream file;
int count; //图片文件名序号
FileNumber num=new FileNumber();//图片文件名序号类,num为对象
count=num.NumberReadFromFile();//获取图片文件序号
try {
System.out.println("获取网络图片");
String fileName = (String.valueOf(count)).concat(httpUrl.substring(httpUrl.lastIndexOf(".")));//图片文件序号加上图片的后缀名,后缀名用了String内的一个方法来获得
//httpUrl.substring(httpUrl.lastIndexOf("/"));//这样获得的文件名即是图片链接里图片的名字
String filePath = "d:/image/";//图片存储的位置
url = new URL(/blog_article/httpUrl/index.html);
in = new BufferedInputStream(url.openStream());
file = new FileOutputStream(new File(filePath+fileName));
int t;
while ((t = in.read()) != -1) {
file.write(t);
}
file.close();
in.close();
System.out.println("图片获取成功");
count=count+1;//图片文件序号加1
num.NumberWriteToFile(count);//将图片名序号保存
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//获取网页的代码保存在String格式的Content中
public String getHtmlCode(String httpUrl) throws IOException {
String content ="";
URL uu = new URL(/blog_article/httpUrl/index.html); // 创建URL类对象
BufferedReader ii = new BufferedReader(new InputStreamReader(uu
.openStream())); // //使用openStream得到一输入流并由此构造一个BufferedReader对象
String input;
while ((input = ii.readLine()) != null) { // 建立读取循环,并判断是否有读取值
content += input;
}
ii.close();
return content;
}
//分析网页代码,找到匹配的网页图片地址
public void get(String url) throws IOException {
String searchImgReg = "(?x)(src|SRC|background|BACKGROUND)=('|\")/?(([\\w-]+/)*([\\w-]+\\.(jpg|JPG|png|PNG|gif|GIF)))('|\")";//用于在网页代码Content中查找匹配的图片链接。
String searchImgReg2 = "(?x)(src|SRC|background|BACKGROUND)=('|\")(http://([\\w-]+\\.)+[\\w-]+(:[0-9]+)*(/[\\w-]+)*(/[\\w-]+\\.(jpg|JPG|png|PNG|gif|GIF)))('|\")";
String content = this.getHtmlCode(url);//this指对象gcp,在此地调用获取网页代码,getHtmlCode方法
//System.out.println(content); //输出的content将是一个连续的字符串。
Pattern pattern = Pattern.compile(searchImgReg);//java.util.regex.Pattern
Matcher matcher = pattern.matcher(content); //java.util.regex.Matcher
while (matcher.find()) {
System.out.println(matcher.group(3));//输出图片链接地址到屏幕
// System.out.println(url);
this.getHtmlPicture(matcher.group(3));//对象调用getHtmlPicture从网上下载并输出图片文件到指定目录
}
pattern = Pattern.compile(searchImgReg2);
matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println(matcher.group(3));
this.getHtmlPicture(matcher.group(3));
}
// searchImgReg =
// "(?x)(src|SRC|background|BACKGROUND)=('|\")/?(([\\w-]+/)*([\\w-]+\\.(jpg|JPG|png|PNG|gif|GIF)))('|\")";
}
//主函数url网页的地址
public static void main(String[] args) throws IOException {
String url = "http://www.baidu.com";
GetContentPicture gcp = new GetContentPicture();
gcp.get(url);
}
}
package cn.mypic;
import java.io.*;
public class FileNumber{
//文件写
public void NumberWriteToFile(int x){
int c=0;
c=x;
File filePath=new File("d:/image");//文件名序号TXT文件保存地址
File f1=new File(filePath,"number.txt");
try{
FileOutputStream fout=new FileOutputStream(f1);
DataOutputStream out=new DataOutputStream(fout);
out.writeInt(c);
}
catch(FileNotFoundException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
}
//文件读
public int NumberReadFromFile(){
int c1 = 0;
File filePath=new File("d:/image");
File f1=new File(filePath,"number.txt");
try{
FileInputStream fin=new FileInputStream(f1);
DataInputStream in=new DataInputStream(fin);
c1=in.readInt();
System.out.println(c1);//输出文件内容至屏幕
}
catch(FileNotFoundException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
return c1;
}
public static void main(String args[]){
}
}
Java代码
[3] 向微信发送讯息
来源: 互联网 发布时间: 2014-02-18
向微信发送消息
应用只需要进行一次注册就行了,然后在以后的使用中只需要封装消息,让通信类
发送即可。从前面的类图中可以看到,封装消息的顺序是首先生成需要发送的媒体
对象,然后将媒体对象附加到消息对象中,接着建立请求对象,最后使用通信类发
送即可。说明,本文是来自脚本之家,发到这里主要是分享一下,大家一起学习下。
最新技术文章: