2013年9月

首页2013年9月
25
Sep
0

新手学oc十二:内存管理之自动释放池

1.self.dog = [[Dog alloc]init]问题

[[Dog alloc]init] 引用计数器为1

self.dog 属性设置器会再次为计数器+1

所以应该修改为

1._dog = [[Dog alloc]init];

2.self.dog = [[[Dog alloc]init]autorelease];自动释放池再次release;

2.类回收

-(void)dealloc

{

[_dog release];

[supper dealloc];

}

3.自动释放池 用于释放对象后面加autorelease的对象 其实就是单纯让引用计数-1

@autoreleasepool{

}

new copy alloc创建的对象不会自动入池 release 释放 通过autorelease才能入池

new 相当于同时alloc init

4.自动释放池可以嵌套使用

Foundation框架必须要有一个自动释放池

今天内容有点少 哈哈哈

oc程序语言方面的内容就学完了 下一步就要学ios的课程或是框架的学习 如文件操作类之类的

再次鼓励一下自己吧 确实很难坚持啊 不过每天要进步一点点 加油

22
Sep
5

新手学oc十一:内存管理之合成存取器

1.常量引用计数是没有的 它返回-1

2.内存释放检测使用Analyze按钮Snip20130922_1

Snip20130922_2

 

运行结果:

[c]

2013-09-22 20:49:45.310 MemoryManager[4108:303] eat

2013-09-22 20:49:45.312 MemoryManager[4108:303] retainCount = 1

2013-09-22 20:49:45.313 MemoryManager[4108:303] eat

2013-09-22 20:49:45.314 MemoryManager[4108:303] eat

2013-09-22 20:49:45.314 MemoryManager[4108:303] retainCount = 1

[/c]

3.合成存取器中对内存的使用方法

[c]

-(void)setMyStr:(NSString *)_myStr

{

myStr = _myStr;

[_myStr retain];

}

[/c]

多次调用后 引用计数就错误了 不能正确释放了

修改后:

[c]

-(void)setMyStr:(NSString *)_myStr

{

if (myStr != _myStr) {

myStr = _myStr;

[_myStr retain];

}

}

[/c]

这时引用给了另一个对象MYSTR 又会发生原对象引用计数不变 实际它应该减少才对 因为当前已经不引用它了 这时又不能正确释放

[c]

-(void)setMyStr:(NSString *)_myStr

{

if (myStr != _myStr) {

[myStr release];

myStr = _myStr;

[_myStr retain];

}

}

[/c]

如果这时不希望外部的MYSTR改变而影响内部MYSTR又怎么办呢

[c]

-(void)setMyStr:(NSString *)_myStr

{

if (myStr != _myStr) {

[myStr release];

myStr = _myStr;

[_myStr copy];//copy method

}

}

[/c]

或者

@property(copy) NSString *youStr;

22
Sep
0

新手学OC十:内存管理之引用计数和自动释放机制

1.类方法和实例方法 为什么不同

2.NSNull

表示什么也没有 只有一个方法[NSNull null]

3.所有权

凡是以alloc(dealloc) new 或名字中包含copy的方法创建的对象

使用retain获得所有权的对象

[object retain];

[object release];

取得对象的计数 返回NSUInteger

[object retainCount];

[c]

Car *car;

car = [[Car alloc]init];

NSLog(@"%ld",[car retainCount]);

[car retain];

NSLog(@"%ld",[car retainCount]);

[car release];

NSLog(@"%ld",[car retainCount]);

[car release];

//=============================

2013-09-22 19:48:09.032 ocTest[2235:303] 1

2013-09-22 19:48:09.034 ocTest[2235:303] 2

2013-09-22 19:48:09.034 ocTest[2235:303] 1

2013-09-22 19:48:09.035 ocTest[2235:303] car retain count = 0 ,car is dealloc!

[/c]

3.特殊的NSString

[c]

//只有这种方法RETAINCOUNT才为1

NSString *str = [[NSString alloc]initWithCString:"acb" encoding:NSUTF8StringEncoding];

NSLog(@"str retainCount = %ld",[str retainCount]);

NSString *st = @"china";

NSLog(@"st = %@",st);

NSLog(@"st retainCount = %ld",[st retainCount]);

NSString *s = [NSString stringWithFormat:@"i love"];

NSLog(@"s retainCount = %ld",[s retainCount]);

//=============================

2013-09-22 20:19:01.377 ocTest[3335:303] str retainCount = 1

2013-09-22 20:19:01.380 ocTest[3335:303] st = china

2013-09-22 20:19:01.384 ocTest[3335:303] st retainCount = -1

2013-09-22 20:19:01.387 ocTest[3335:303] s retainCount = 1

[/c]

4.retainCount在计数等于0之后就会变得不正确,因为对象已释放的原因

22
Sep
6

新手学oc九Foundation框架下:数值封装和词典

1.NSValue封装值

NSNumber是NSValue的子类

[c]

int nNum = 10;

NSMutableArray *intArray = [[NSMutableArray alloc]initWithCapacity:10];

//对象地址? ? ? ? 对象类型

NSValue *intVal = [NSValue valueWithBytes:&nNum objCType:@encode(int)];

[intArray addObject:intVal];

int k;

NSValue * intVal2;

intVal2 = [intArray objectAtIndex:0];

[intVal2 getValue:&k];

NSLog(@"intArray1 %d",k);

//封装DOUBLE

double ndouble = 3.14;

intVal = [NSValue valueWithBytes:&ndouble objCType:@encode(double)];

[intArray addObject:intVal];

double ndouble2;

intVal2 = [intArray objectAtIndex:1];

[intVal2 getValue:&ndouble2];

NSLog(@"intarray2 %f",ndouble2);

//封装结构

struct Student

{

char name[100];

double score;

char sex;

}stu = {"lilei",90.5,'M'};

intVal = [NSValue valueWithBytes:&stu objCType:@encode(struct Student)];

[intArray addObject:intVal];

struct Student myStu;

intVal2 = [intArray objectAtIndex:2];

[intVal2 getValue:&myStu];

NSLog(@"myStu %s,%f,%c",myStu.name,myStu.score,myStu.sex);

//=====================================

2013-09-18 07:15:59.000 ocTest[615:303] intArray1 10

2013-09-18 07:15:59.002 ocTest[615:303] intarray2 3.140000

2013-09-18 07:15:59.003 ocTest[615:303] myStu lilei,90.500000,M

[/c]

2.词典

[c]

NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:pointVal,@"point",doubleVal,@"double",

rangeVal,@"range", nil];

NSValue *value;

value = [dictionary objectForKey:@"point"];

NSPoint pointValue;

pointValue = [[dictionary objectForKey:@"point"]pointValue];? //用哪种方法都行

//? ? ? ? value = [dictionary objectForKey:@"point"];

//? ? ? ? [value getValue:&pointValue];

NSLog(@"point x = %f, y = %f",pointValue.x,pointValue.y);

[/c]

15
Sep
0

delphi之模拟点击网页中的按钮

有三种方法来提交

1、假如知道按钮名称
上面代码中有 这样的代码name=”btnLogin” ,表明此按钮名称为 btnlogin
程序代码就可以 这样来模拟
wb1.OleObject.document.all.item(‘btnLogin’).click;
2、假如知道按钮id
上面代码中有 这样的代码 id=”btnLogin” ,表明此按钮id为 btnlogin
程序代码可以 这样来模拟
wb1.OleObject.document.getElementByIdx_x(‘btnLogin’).click ;
3、假如名称及ID都没有,就只能判断这个提交按钮是第几个了]
按照登录页面源码来分析应当是第八个按钮,按以下语句即可实现登录按钮点击事件.
wb1.OleObject.document.getElementsByTagName_r(‘input’).item(7).click;

procedure TForm1.btn1Click(Sender: TObject);

begin
wb1.Navigate('http://passport.cnblogs.com/login.aspx');
end;

procedure TForm1.btnloginClick(Sender: TObject);
var
Doc: IHTMLDocument2;
userinputelement, pwdinputelement: ihtmlinputelement;
begin
doc := wb1.document as ihtmldocument2;
userinputelement := (doc.all.item('tbUserName', 0) as ihtmlinputelement);
userinputelement.value := Trim(edt1.Text);
pwdinputelement := (doc.all.item('tbPassword', 0) as ihtmlinputelement);
pwdinputelement.value := Trim(edt2.Text);
下面三种都可以,自己测试
a.按按钮名称来点击
wb1.OleObject.document.all.item('btnLogin').click;
b.按钮钮ID来点击
wb1.OleObject.document.getElementByIdx_x('btnLogin').click ;
c.按第几个按钮来点击
wb1.OleObject.document.getElementsByTagName_r('input').item(7).click;
end;

 

 

最后一种,没有ID ,name,也不知道Tag值,点击指定文字超链接可以通过下面方法:

memo1.Clear;
for i := 0 to WebBrowser1.OleObject.document.links.Length - 1 do
begin
memo1.Lines.add(WebBrowser1.OleObject.document.links.item(i).href); //链接

memo1.Lines.add(WebBrowser1.OleObject.document.links.item(i).innerText) //链接名称

end;

procedure TForm1.Button2Click(Sender: TObject);
var
doc:IHTMLDocument2;
all:IHTMLElementCollection;
i,sum:integer;
item:OleVariant;
begin
doc:=self.WebBrowser1.Document as IHTMLDocument2;
all:=doc.links;
sum:=all.length;
memo1.Clear;
for i:=0 to sum-1 do
begin
item:=all.item(i,varEmpty);
memo1.Lines.Add(item.href);? //取链接(URL)

memo1.Lines.Add(item.innerText);? //取链接名称
memo1.Lines.Add(item.outerHTML);? //取链接源代码
memo1.Lines.Add(item.id);? //链接ID
memo1.Lines.Add(item.tagName);? //链接标签名

end;

 

procedure TForm1.Button1Click(Sender: TObject);
var
doc: IHTMLDocument2;
all: IHTMLElementCollection;
i, sum: integer;
item: OleVariant;
begin
doc := self.WebBrowser1.Document as IHTMLDocument2;
all := doc.links;
sum := all.length;
for i:=0 to sum-1 do
begin
item := all.item(i,varEmpty);
if item.innerText = '工商银行' then???????????? ?//www.hao123.com
item.click;
//WebBrowser2.Navigate(item.href);
end;

end;

类似的可以看这篇文章:[delphi实现自动填写表单和调用网页上的函数]

 

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Align := alTop;
Button2.Enabled := False;
Button3.Enabled := False;
Button4.Enabled := False;
Button1.Caption := '模拟一个页面';
Button2.Caption := '假如知道按钮名称';
Button3.Caption := '假如知道按钮的 ID';
Button4.Caption := '假如只知道是第几个按钮';
end;

{模拟一个页面}
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate(
'about:<head><title>标题</title><body>' +
'<form method="POST" action="http://www.nobird.org/">'?+
'<input type="submit" value="提交" id="btnID" name="btnName">' +
'</form></body>');
Button2.Enabled := True;
Button3.Enabled := True;
Button4.Enabled := True;
end;

{假如知道按钮名称, 譬如是: btnName}
procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.all.item('btnName').click;
//WebBrowser1.OleObject.document.all.item('btnName', 0).click;
FormCreate(nil);
end;

{假如知道按钮的 ID, 譬如是: btnID}
procedure TForm1.Button3Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.getElementByID('btnID').click;
FormCreate(nil);
end;

{假如只知道是第几个按钮, 譬如是第一个}
procedure TForm1.Button4Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.getElementsByTagName('input').item(0).click;
FormCreate(nil);
end;

end.