UILineBreakMode使用

typedef enum {

UILineBreakModeWordWrap = 0,

UILineBreakModeCharacterWrap,

UILineBreakModeClip,

UILineBreakModeHeadTruncation,

UILineBreakModeTailTruncation,

UILineBreakModeMiddleTruncation,

} UILineBreakMode;

 

UILineBreakModeWordWrap = 0,

以单词为单位换行,以单位为单位截断。

UILineBreakModeCharacterWrap,

以字符为单位换行,以字符为单位截断。

UILineBreakModeClip,

以单词为单位换行。以字符为单位截断。

UILineBreakModeHeadTruncation,

以单词为单位换行。如果是单行,则开始部分有省略号。如果是多行,则中间有省略号,省略号后面有4个字符。

UILineBreakModeTailTruncation,

以单词为单位换行。无论是单行还是多行,都是末尾有省略号。

UILineBreakModeMiddleTruncation,

以单词为单位换行。无论是单行还是多行,都是中间有省略号,省略号后面只有2个字符。

 

设置UIButton的文字显示位置、字体的大小、字体的颜色

btn.frame = CGRectMake(x, y, width, height);

[btn setTitle: @”search” forState: UIControlStateNormal];

//设置按钮上的自体的大小

//[btn setFont: [UIFont systemFontSize: 14.0]];    //这种可以用来设置字体的大小,但是可能会在将来的SDK版本中去除改方法

//应该使用

btn.titleLabel.font = [UIFont systemFontOfSize: 14.0];

[btn seBackgroundColor: [UIColor blueColor]];

//最后将按钮加入到指定视图superView

[superView addSubview: btn];

==========================================================

tvnamelabel=[[UIButton alloc]initWithFrame:CGRectMake(5,5,200,40)];

这样初始化的button,文字默认颜色是白色的,所有如果背景也是白色的话,是看不到文字的,

btn.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft ;//设置文字位置,现设为居左,默认的是居中

[btn setTitle:@“title”forState:UIControlStateNormal];// 添加文字

有些时候我们想让UIButton的title居左对齐,我们设置

btn.textLabel.textAlignment = UITextAlignmentLeft

是没有作用的,我们需要设置

btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft;

但是问题又出来,此时文字会紧贴到做边框,我们可以设置

btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);

使文字距离做边框保持10个像素的距离。

=======================================================

设置UIButton上字体的颜色设置UIButton上字体的颜色,不是用:

[btn.titleLabel setTextColor:[UIColorblackColor]];

btn.titleLabel.textColor=[UIColor redColor];

而是用:

[btn setTitleColor:[UIColor blackColor]forState:UIControlStateNormal];

UILabel显示换行的方法

UILabel *label;

//设置换行

label.lineBreakMode = UILineBreakModeWordWrap;label.numberOfLines = 0;

换行符还是\n比如

NSString *string = @”lineone\nlinetwo”

记得要把label的高度设置的足够显示多行内容。

objective-c 入门学习建议

1、把基础知识学习好。c、数据结构、面向对象。

2、一定要不断在调试程序,写程序,不能光看。

3、不要一开始就学习cocoa框架,至少要把objective-c搞明白后,再学习。

4、不停的到技术社区学习,提问。

5、切记不要一口吃个胖子,所有技术都是一步一步学习到的。

6、耐心, 坚持编程训练!

 

iPhone内存管理的一些整理

内存管理个人总结

无论编写任何程序,都需要确保能够有效和高效地管理资源。程序内存就是这些资源中的一种。在Objective-C程序中,必须确保所创建的对象,在不再需要它们的时候被销毁。

注意:iOS不提供垃圾回收机制。

一般规则:

只能释放或自动释放自己所拥有的对象

一般以alloc ,new, copy创建的对象都具有所有权,或者如果向一个对象发送了一条retain消息,也会获得该对象的所有权。

此时需要用release进行释放或者调用自动释放池autorelease;自动释放池的调用是系统来完成的。

需要将接收到的对象存储为某个实例变量的属性,您必须保留或复制该对象。

释放实例:

UIView *view 1= [[UIView alloc]init];

Self.view = view1;

[view1 release];

不需要释放的例子:

UIButton*button=[UIButton buttonWithType:UIButtonTypeRoundedRect];

由于调用的类方法没有使用alloc,new,copy等所以它自动释放,不需要手动释放。

调用自动释放池的例子:

-(NSArray *)rearray

{

NSArray *array = [[NSArray alloc]initWithObjects:@”1”,@”2”,nil];

return [array autorelease];

}

这个方法既没有破坏内存规则,又避免了接收值的使用者不知道何时销毁对象的现象。如果直接return array会造成内存泄露,如果先释放在返回的话会返回无效对象([array release];return array;)这也是错误的。当然如果直接调用类方法就可以这样做:

-(NSArray *)rearray

{

NSArray *array = [NSArray arrayWithObjects:@”1”,@”2”,nil];

return array;

}

 

在 Objective-C 程序中,对象会被创建和销毁。为了确保应用程序不会使用不必要的内存,对象应该在不需要它们的时候被销毁。当然,在需要对象时保证它们不被销毁也很重要。

任何对象都可能拥有一个或多个所有者。只要一个对象至少还拥有一个所有者,它就会继续存在。如果一个对象没有所有者,则运行时系统会自动销毁它。

可以使用retain来获得一个对象的所有权。

保留计数(retainCount)

在调用retain方法后通过引用计数—通常被称为“保留计数”—实现的。每个对象都有一个保留计数。

创建一个对象时,该对象的保留计数为1。

向一个对象发送retain消息时,该对象的保留计数加1。

向一个对象发送release消息时,该对象的保留计数减1。

向一个对象发送autorelease消息时,该对象的保留计数会在将来的某个阶段减1。

如果一个对象的保留计数被减为0,该对象就会被回收.(直接调用dealloc进行释放)。

当显式地查询对象的保留计数是多少。由于添加了保护机制,当保留计数被减为0时,控制台输出仍然为1因此会造成误导。

共享对象的有效性

Cocoa的所有权策略规定,被接收的对象通常应该在整个调用方法的作用域内保持有效。此外,还可以返回从当前作用域接收到的对象,而不必担心它被释放。对象的getter方法返回一个缓存的实例变量或者一个计算值,这对您的应用程序来说无关紧要。重要的是,对象会在您需要它的这段期间保持有效。

这一规则偶尔也有一些例外情况,主要可以总结为以下两类。

当对象从一个基本的集合类中被删除的时候。

heisenObject = [array objectAtIndex:n];

[array removeObjectAtIndex:n];

// heisenObject could now be invalid.

当对象从一个基本的集合类中被删除时,它会收到一条release(不是autorelease)消息。如果该集合是这个被删除对象的唯一所有者,则被删除的对象(例子中的heisenObject)将被立即回收。

当一个“父对象”被回收的时候。

id parent = <#create a parent object#>;

// …

heisenObject = [parent child] ;

[parent release]; // Or, for example: self.parent = nil;

// heisenObject could now be invalid.

在某些情况下,您通过另外一个对象得到某个对象,然后直接或间接地释放父对象。如果释放父对象会使其被回收,而且父对象是子对象的唯一所有者,那么子对象(例子中的heisenObject)将同时被回收(假设它在父对象的dealloc方法中收到一条release而非autorelease消息)。

为了防止这些情况发生,您要在接收heisenObject后保留该对象,并

在使用完该对象后对其进行释放,例如:

 

heisenObject = [[array objectAtIndex:n] retain];

[array removeObjectAtIndex:n];

// use heisenObject.

[heisenObject release];

如果在您的类中有实例变量对象,您必须实现一个dealloc方法来释放它们,然后调用超类的dealloc实现。

重要:决不要直接调用另一个对象的dealloc方法。

保留循环

在某些情况下,两个对象之间可能会出现循环引用的情况,也就是说,每一个对象都包含一个实例变量引用对方对象。例如,考虑一个文本程序,程序中对象间的关系如图1所示。“文档(Document)”对象为文档中的每个页面创建一个“页(Page)”对象。每个Page对象具有一个实例变量,用来跟踪该页所在的文档。如果Document对象保留了Page对象, 同时Page对象也保留Document对象,则这两个对象都永远不会被释放。只有Page对象被释放,Document的引用计数才能变为0,而只有Document对象被回收,Page对象才能被释放。

 

针对保留循环问题的解决方案是“父”对象应保留其“子”对象,但子对象不应该保留其父对象。因此,在图1中,document对象要保留page对象,但page对象不保留document对象。子对象对其父对象的引用是一个弱引用的例子,这部分内容在“对象的弱引用”有更充分的描述。

保留一个对象创建了一个对该对象的“强”引用。一个对象只有在它的所有强引用都被释放后才能被回收。因此,一个对象的生命周期取决于其强引用的所有者。在某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。

NSMutableArray *array;

NSUInteger i;

// …

for (i = 0; i < 10; i++) {

NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger: i];

[array addObject:allocedNumber];

[allocedNumber release];

}

 

在这段代码中,您需要在for循环的作用域内向allocedNumber发送release消息,以抵消之前的alloc。由于数组在用addObject:方法添加数字时对其进行了保留,因此只要它还在数组中就不会被释放。

要理解这一点,您要把自己放在实现这种集合类的作者的位置。您要确保交给您管理的对象不能在您的眼皮底下消失,所以您要在这些对象被加入集合中时向它们发送retain消息。如果它们被删除,您还必须相应地发送release消息,并且在您自己的dealloc方法中,您还应该向其余的对象发送release消息。

您可以使用常见的alloc和init消息来创建一个NSAutoreleasePool对象,并使用drain(如果您向一个自动释放池发送autorelease或retain消息,会引发异常—要了解release和drain之间的差异,请参考“垃圾回收”)销毁它。自动释放池应该总是在与它被创建时所处的相同上下文环境(方法或函数的调用,或循环体)中被销毁。

 

自动释放池被置于一个堆栈中,虽然它们通常被称为被“嵌套”的。当您创建一个新的自动释放池时,它被添加到堆栈的顶部。当自动释放池被回收时,它们从堆栈中被删除。当一个对象收到送autorelease消息时,它被添加到当前线程的目前处于栈顶的自动释放池中。

 

嵌套自动释放池的能力是指,您可以将它们包含进任何函数或方法中。例如,main函数可以创建一个自动释放池,并调用另一个创建了另外一个自动释放池的函数。或者,一个方法可以有一个自动释放池用于外循环,而有另一个自动释放池用于内循环。嵌套自动释放池的能力是一种很显著的优势,但是,当发生异常时也会有副作用

我们通常会提及自动释放池是被嵌套的,如清单1所示。但是,您也可以认为嵌套自动释放池位于一个堆栈中,其中,“最内层”的自动释放池位于栈顶。如前所述,嵌套自动释放池实际上是这样实现的:程序中的每个线程都维护一个自动释放池的堆栈。当您创建一个自动释放池时,它被压入当前线程的堆栈的栈顶。当一个对象被自动释放时—也就是说,当一个对象收到一条autorelease消息或者当它作为一个参数被传入addObject:类方法时—它总是被放入堆栈顶部的自动释放池中。

在垃圾回收环境中,release是一个空操作。因此,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。因此,在通常情况下,您应该使用drain而不是release来销毁自动释放池。

 

程序小白的技术普及帖

扫盲1:同步和异步

同步(Synchronous,主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。比如你需要发送一条短信,必须等信息发送完毕才能退出界面;异步(Asynchronous,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步。比如你发送一条短信,不用等它发送完毕,你就可以爱干嘛干嘛去,系统会在后台把这条短信发送完毕。

举个例子:同步就是你追一个姑娘,晚上给她发我爱你,她一直没有搭理你,你就一直等,一直等,一直等,一直等,直到姑娘终于答复了你,我也爱你,于是你们在一起了;异步就是你追一个姑娘,晚上给她发我爱你,没等她搭理你,你就又给另一个姑娘发我爱你,没等她搭理你,你就又给第三个姑娘发我爱你,姑娘一、姑娘二、姑娘三都以为你是专心致志的对自己,最后可能有的答复了我爱你,有的答复了对不起

扫盲2:模态与非模态

模态(Mode,就是指当这个控件弹出的时候,鼠标不能单击这个控件之外的区域,这种控件往往是用户进行了某种操作后才出现的。例如:windows的选择字体颜色对话框 ;必须先关闭对话框才能进行其他操作;非模态(Modeless,通常用于显示用户需要经常访问的控件和数据,并且在使用这个控件的过程中需要访问其它窗体的情况。例如:word的查找对话框。可以直接点击任何地方,例如,发邮件时添加附件就是个非模态的。

举个例子:模态就是你陪这个姑娘吃饭,姑娘让你不许玩手机,不许你上厕所,不许你听音乐,甚至不许你说话,只能做一件事,就是乖乖把饭吃完;非模态就是你陪这个姑娘吃饭,姑娘不管你,爱玩手机玩手机,爱刷微博刷微博,爱上厕所上厕所,甚至可以玩亲亲

扫盲3:轮询和中断

中断(interrupts,程序中断通常简称中断,是指程序在正常运行的过程中,由于预选安排或发生了各种随机的内部或外部事件,使程序中断当前操作,转到处理相应事件,这个过程称为程序中断;轮询(Polling,是让程序以一定的周期按次序查询每一个外设,看它是否有数据输入或输出的要求,若有,则进行相应的输入/输出服务。

举个例子:中断就是你跟这个姑娘开始同居,你正在写一个项目计划书的时候,姑娘一会儿跟你说玻璃脏了,要你擦擦玻璃,一会儿跟你说地板脏了,要擦擦地板;轮询就是你跟这个姑娘开始同居,她一会儿跟你说玻璃脏了,一会儿说地板脏了,你淡定的告诉她,当脏的地方累积到10个的时候,再告诉你,你才开始打扫,这样就不会频繁的被打断啦。

扫盲4:长连接和短连接

长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持;短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。

举个例子:长连接就是你们俩开始异地恋了,他会每天给你一个电话,保持跟你的联系,遇到节假日等大事,会额外准备一些惊喜给你;短连接就是你们俩开始异地恋了,他会在逢年过节等特殊情况下,才跟你取得联系,然后就消失

 

38条SEO经典语录

SEO经典语录38条本人结合了网上的信息整理了38条国内SEO经典语录,希望有兴趣的朋友一起参与收集整理。

1、内容是SEO的基础,关键词是SEO的核心,链接是SEO的关键,UEO是SEO的深化。

2、SEO做得好的网站都是一样的,SEO做得不好的网站各有各的不同。

3、要成为SEOer,首先和百度、Google、Yahoo等搜索引擎谈恋爱。

4、SEO没有高手,只有新手和老手。

5、选择一个优化好的建站系统会省下很多SEO工作。

6、先了解搜索引擎的特性,再做SEO会事半功倍。

7、必须具备的网站优化十心:耐心、决心、专心、关心、当心、贪心、狠心、谈心、良心、舒心。

8、认真分析一个SEO做得好的网站胜过浮躁地看100篇SEO文章。

9、最有效方法是在SEO实践与案例分析中学习SEO。

10、SEO知识是学出来的,SEO能力是练出来的,SEO经验是积累出来的,SEO关键词优化直觉是熏陶出来的。

11、SEO精通的目的全在于应用。

12、网站没有良好的用户体验,SEO不是万能的。

13、SEO做得好能够带来流量,UEO做得好能够留住并且转化流量。

14、搜索引擎营销,SEO、SEM和UEO,一个都不能少。

15、网络营销的本质是营销,SEO是网络营销中的一种。因此,不要为了SEO而SEO,而要为了营销进行SEO。

16、网站优化≠SEO,网站优化至少包括SEO和UEO两方面,因此真正的网站优化必须坚持SEO和UEO相生相长的优化理念。

17、当大家的网站内部SEO都做得差不多时,比拼就是谁的反向链接质量高并且数量多了。

18、SEO有时候简单的像数学公式,很容易明白,但实际解题中,有人可以找到N中解法,有人一种也找不到。

19、SEO只有基本的原则,而无固定的战术。只有变才是不变的。一个站可以做的事情,不代表你的站也可以做。

20、宁可坚持每10天加一篇文章,也不愿一天加100篇文章就了事。宁愿3天不更新,也不愿意1天抄10篇。

21、相信一个专家比让自己成为专家难得多。当站点遇上“办公室政治”,不能再用常规来解释问题,权力设计、权力审美压倒一切。

22、过份依赖战术的人,迟早会抱怨武器不够精准。

23、分享经验是最好的营销,非商业是最好的商业。

24、不在乎一个站点开始有多滥多简单,好站点是在不断改进中完美和丰富起来的,而不是生而完美。

25、SEO学会尊重搜索引擎,彼此是朋友而非敌人。

26、SEO除了排名,还有搜索流量,除了流量,还有转化率。

27、一切都需要耐心。在SEO领域,耐心是一种美德。

28、SEO名词解释:用心良苦,搬起石头砸自己的脚。

29、SEO技术最强的应该算搜索引擎编制规则人员,他们自己并不知道seo是什么,成千上万个规则一定。最强的SEO组合,反而只能得零分 。

30、SEO理论懂的越多,收获越少。SEO最重要的是在实践中不断总结经验。

31、不要看太多的SEO方面的书 ,大部分都只是形而上学的理论。而并没有充分的实践,反而很多半不拉的理论会延误了你的重点。

32、SEO专家说:把你的网站做好,用户喜欢了。搜索引擎也就喜欢了,如果只是为了迎合搜索引擎的做法,搜索引擎反而是更忌讳的。

33、真正的发现了SEO某几点更有效果的人,他们偷偷在那赚钱。因为那几点的漏洞很快被搜索公司发现,被填补以后才又成了大家广泛传播的对象。

34、如果通常的SEO做法都有用。大家每个人都在做的时候,谁会排到前面。所以做了等于没有做。

35、SEO顶尖专家说:跟你的同行做一些链接就是最好的SEO。其他什么都别动,别去照顾SEO就是SEO的经典。

36、SEO别拿好域名去做,用一些垃圾域名,你反而能得到意料之外的收获。

37、SEO是广撒网,少收鱼,不要将你重点的网站拿出去撒网,用一些垃圾的,不要的域名去尝试,自然也别牵连,包括IP地址。

38、关于SEO能写出100万字,能卖出去100块。不过最亏的还是用心看的你,浪费了你的宝贵时间。

Objective-c常用函数和常数

算术函数

函数名 说明
int rand() 随机数生成。
(例)
srand(time(nil)); //随机数初期化
int val = rand()%50; //0~49之间的随机数
int abs(int a) 整数的绝对值
(例)int val = abs(-8);
→8
※浮点数的时候用fabs。
double fabs(double a) 浮点数的绝对值
(例)double val = fabs(-12.345);
→12.345
※整数的时候用abs。
double floor(double a) 返回浮点数整数部分(舍弃小数点)
(例)double val = floor(12.345);
→12.000
double ceil(double a); 返回浮点数整数部分(舍弃小数点部分,往个位数进1)
(例)double val = ceil(12.345);
→13.000
double pow(double a, double b) a的b次方
(例)double val = pow(2, 3);
→8
double sqrt(double a) a的平方根
(例)double val = sqrt(2);
→1.41421356

三角函数

函数名 说明
double cos(double a) 余弦函数 (a:弧度)
double sin(double a) 正弦函数 (a:弧度)
double tan(double a) 正切函数 (a:弧度)
double asin(double a) 反正弦值 (a:弧度)
double acos(double a) 反余弦函数(a:弧度)
double atan(double a) 反正切函数
double atan2(double a, double b) 返回给定的 a 及 b 坐标值的反正切值

指数函数

函数名 说明
double log(double a) 以e 为底的对数值
double log10(double a) 对数函数log

常数

常数名 说明
M_PI 圆周率(=π)
M_PI_2 圆周率的1/2(=π/2)
M_PI_4 圆周率的1/4(=π/4)
M_1_PI =1/π
M_2_PI =2/π
M_E =e
M_LOG2E log_2(e)
M_LOG10E log_10(e)