Objective C中的字符串及集合
一. NSString字符串
1. 基本概念:
1) Cocoa中提供NSString和NSMutableString两种字符串,前者用于处理内容不变、固定的字符串,而NSMutableString类用于处理内容可变的字符串;
继承关系:NSObjectàNSStringàNSMutableString
2) NSString的字符编码格式为Unicode编码;
NSStringEncoding:定义的常量
NSASCIIStringEncoding: ASCII
NSUTF8StringEncoding; UTF-8
NSUnicodeStringEncoding; utf-8
2. 字符串的生成
1) 使用@””标识NSString字符串,如:
NSString str =@”yang”;
2) 但使用上述方式只能生成含有英文和数字的NSString实例,要生成含有汉子等双字节的字符串实例,必须使用:
+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding
第一个方法创建自动释放型的实例。后一个方法是执行alloc方法后进行初始化的;
3) 使用格式创建字符串:
+ (id)stringWithFormat:(NSString *)format, ...
- (id)initWithFormat:(NSString *)format ...
格式本身是NSString串,因此加上@,如果里面有NSString字符串实例,用%@标识;
NSString str =[NSString stringWithFormat:@“%@pro”,str1];
4) NSRange用于定义一个数据的范围
NSRangerange = NSMakeRange(0,5);
3. 字符串处理
1) 字符串长度:- (NSUInteger)length
2) 取字符串某个位置的字符
- (unichar)characterAtIndex:(NSUInteger)index
3) 拼接字符串:
-(NSString *)stringByAppendingString: (NSString*)aString
-(NSString *)stringByAppendingFormat: (NSString*)format...
例:str2 = [str stringByAppendingString:@”%@%@”,str3,str4];
4) 求子字符串:
- (NSString *)substringFromIndex:(NSUInteger)anIndex
- (NSString *)substringToIndex:(NSUInteger)anIndex
- (NSString *)substringWithRange:(NSRange)aRange
5) 比较字符串大小:
- (BOOL)isEqualToString:(NSString *)aString
6) 比较前置和后置串:
- (BOOL)hasPrefix:(NSString *)aString
- (BOOL)hasSuffix:(NSString *)aString
7) 字符串检索:
- (NSRange)rangeOfString:(NSString*)aString
8)
二. NSMutableString字符串
1. 生成
生成方法与NSString相同,但是不能使用@的方法生成NSMutable字符串;
NSString:
+(id)string;//生成一个空字符串
2. 追加字符串
- (void)appendString:(NSString*)aString
- (void)appendFormat:(NSString*)format ...
3. 插入字符串
- (void)insertString:(NSString*)aString atIndex:(NSUInteger)anIndex
4. 删除字符串
- (void)deleteCharactersInRange:(NSRange)aRange
5.字符串可以进行文件的读写;
集合部分
cocoa中,数组、字典以及 集合部分都分可变和不可变两种;
可变的可以增加、删除和修改里面的数据,不可变的则不能;
三. NSObject àNSArray àNSMutableArray
在Objective C中也可以使用C语言的数组,如:NSString* names[6];
但是不方便,要使用NSArray数组,数组必须是Cocoa的对象。因此int,char这些数据类型不能直接包括在内(包装类可以实现)
1) 初始化:
指定一个对象初始化:
+ (id)arrayWithObject:(id)anObject
NSArray*array = [NSArray arrayWithObject:string];
2) 多个对象进行初始化
- (id)initWithObjects:(id)firstObj, ...
+(id)arrayWithObjects:(id)firstObj, ...
array= [NSArrayarrayWithObjects:@”tom”,@”yang”,@”blacks”,nil];
指定了多个对象后,最后一个参数必须指定为nil,否则出错;
3) 数组长度: - (NSUInteger)count
4) 通过索引获得对象:
- (id)objectAtIndex:(NSUInteger)index
在NSArray中,也可以通过索引来获取元素,但是不能使用C语言中括号中指定索引的方法,必须使用上面的方法;
5) 获取某个元素的索引位置:
- (NSUInteger)indexOfObject:(id)anObject
四. NSMutableArray
NSMutableArray是NSArray的子类,父类的所有方法子类都可以用。
1) 其他的初始化方法:
-(id) initWithCapacity:(NSUInteger) numItems
+(id) arrayWithCapacity:(NSUInteger) numItems
+ (id)array;//创建内容为空的数组;
2) 添加对象
- (void)addObject:(id)anObject
//
- (void)addObjectsFromArray:(NSArray*)otherArray
//
- (void)setArray:(NSArray*)otherArray
//
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index
3) 对象的删除
- (void)removeObject:(id)anObject
4) 更改某个位置的对象:
-(void) replaceObjectAtIndex:(NSUInteger) indexwithObject:(id) object
五. 字典
用key-value形式存储数据;
1) 初始化
1. 指定一个键值对初始化NSDictionary
+ (id)dictionaryWithObject:(id)anObject forKey:(id < NSCopying>)aKey
dic= [NSDictionary dictionaryWithObject:@”Inter i5” forKey:@”CPU”];
2. 指定多个键值对初始化NSDictionary,两个数组或多个键值对
+ (id)dictionaryWithObjects:(NSArray*)objects forKeys:(NSArray*)keys
+ (id)dictionaryWithObjectsAndKeys:(id)firstObject ,...
2) 获取字典中键值对的个数
-(NSUInteger) count;
3) 获取所有的key和值
-(NSArray*)allvalues;
-(NSArray*) allkeys;
4) 从key值得到value值
-(id) objectForkey: (id)key
六. NSMutableDictionary
1) 生成空字典
NSDictionary +(id)dictionary;
2) 追加键值对
NSMutableDictionary
-(void)setObject:(id)key forKey: (id)key;
3) 删除键值对
-(void)removeObjectForkey: (id)key;
七. NSSet,NSMutableSet
Set是无序集合,其他跟array和dictionary类似;
1) 向Array,Dictionary,Set中添加元素,会主动持有他的所有权;
2) 删除元素时,会释放其所有权;
八. 快速枚举
for …in语法
for(Type variable in expression){
statements }
数组的快速枚举
for(NSString *element in array){
NSLog(@”%@”,element);
}
字典的快速枚举
for(NSString *key in dictionary){
NSLog(@”english:%@ number:%@”, [dictionaryobjectForKey:key],key);
}
项目需要进行主题更换,防Go桌面那样以apk形式进行主题更换,到网上找了下资料,资料不多,所以把自己学习的东西整理一下,以便以后查阅,同时也希望能帮到有需要的人:
一、网上找到的
网址:http://edison-cool911.iteye.com/blog/991048
这个方法要求主题apk中的资源id和应用资源id完全相同,如果应用资源多的话,会出现主题包偏大的情况。
二、我的方法
首先跟上面的一样,用context = createPackageContext(packageName,
CONTEXT_IGNORE_SECURITY);创建一个主题apk的context,再用context得到resources,用Resources类的getIdentifier(name, defType, defPackage)方法,该方法是得到对应名称的资源的id如果资源不存在则返回0:
Name:对应的资源名称(如资源R.drawable.ic_launcher--->name为“ic_launcher”)
defType:对应资源的类型(如资源R.drawable.ic_launcher--->defType为“drawable”)
defPackage:主题apk的包名
有了这个方法就可以用下面的代码取得主题包中的资源:
if (resId == 0) { // 图片不存在,使用默认图片 Resources res = skinContext.getResources(); int id = res.getIdentifier(drawableName, "drawable", skinInfo.context.getPackageName()); drawable = res.getDrawable(id); } else { // 图片存在 Resources res = skinInfo.skinContext.getResources(); drawable = res.getDrawable(R.drawable.xxx); }
还有一个会用到的selector,所以要用程序实现selector,这就要用到StateListDrawable这个类
通过上面的方法得到selector中对应的资源,再通过下面的方法得到selector:
public static StateListDrawable newSelector(Drawable pressed, Drawable focused, Drawable normal) { StateListDrawable states = new StateListDrawable(); states.addState(new int[] { android.R.attr.state_pressed }, pressed); states.addState(new int[] { android.R.attr.state_focused }, focused); states.addState(new int[] { -android.R.attr.state_pressed }, normal); return states; }
用view的setBackgroundDrawable()把上面方法的返回设置进去就可以了。。。
三、关于列出已安装的主题
我的方法:主题包取一个特定前缀的包名,通过遍历安装包得到特定前缀的包,再检查一下包的签名(关于签名检查,我的代码收藏里面有,百度一下也好多)
光棍节的狂欢
“时间到,开抢!”坐在电脑前早已等待多时的小美一看时间已到2011年11月11日零时,便迫不及待地投身于淘宝商城一年一度的大型网购促销活动—— “淘宝双11购物狂欢节”。小美打开早已收藏好的宝贝——某品牌的雪地靴,飞快的点击购买,付款,一回头发现3000双靴子已被抢购一空。
小美跳起来,大叫一声“欧耶!”
小美不知道,就在11日零点过后的这一分钟内,全国有342万人和她一起涌入淘宝商城。当然,她更不知道,此时此刻,在淘宝杭州的一间办公室里,灯火通 明,这里是“战时指挥部”,淘宝技术部的一群工程师,正在紧盯着网站的流量和交易数据。白板上是他们刚刚下的注,赌谁能最准确地猜中流量峰值和全天的交易 总额。他们的手边放着充足的食物和各类提神的饮料。
一阵急促的电话声响起来,是前线部门询问数据的,工程师大声报着:“第1分钟,进入淘宝商城的会员有342万”。过一会工程师主动拿起电话:“交易额超过 1亿了,现在是第8分钟。”接下来,“第21分钟,刚突破2亿”。“第32分钟,3亿了”。“第1个小时,4.39亿”。这些数据随后出现在微博上,引起 一片惊呼。
“完蛋了!”突然有人大喝一声,所有的眼睛都紧张的盯着他,只见他挠挠头,嘿嘿的笑道“我赌的少了,20亿轻松就能过了,我再加5亿”,他跑去白板边上把 自己的赌注擦去,写上25,接下来有人写上28,有人写上30,有人跑到微博上开下盘口,同事们纷纷转载下注。接下来的这24个小时,战时指挥部的工程师 们都不能休息,他们盯着网站的各种监控指标,适时的调整机器和增减功能。顶住第一波高峰之后,这些人开始忙里偷闲的给自己买东西,大家互相交流着哪家买的 移动硬盘靠谱,哪家衣服适合自己的女朋友,不时的有人哀嚎宝贝被人抢了、信用卡额度不够了。同时,旁边白板上的赌注越下越大。
11月11日,这个棍子最多的日子被网民自我调侃的变成了一个节日——“光棍节”。而淘宝网又用疯狂的折扣促销给它赋予了另外一个意义——“购物狂欢 节”。2011年11月11日这一天,淘宝商城与淘宝网交易额之和突破52亿,这个数字是“购物天堂”香港一天零售总额8.5亿的6倍。
网民感受到的是疯抢的喜悦,而网站的技术人员感受到的却是“压力山大”。就如同你家办酒席,宴请左邻右舍,这个办起来容易。倘若宴请十里八乡所有的人,吃 饭的人自然开心,但却不是一般人家能够办得起来的。能办得起来如此盛宴者,需要强大的财力物力、组织能力、技术实力(例如做这么多菜,你的炒锅一定要是 “分布式的”、“可复制的”、“可扩展的”,洗菜切菜要有“工作流引擎”,上菜的路径要用图论来计算出来,甚至连厨房的下水道都要重新设计)。
淘宝能够举办如此盛宴,网站的技术实力可见一斑。淘宝网拥有全国最大的hadoop分布式计算集群之一,日新增数据50TB,有40PB海量数据存储。分 布在全国各地80多个节点的CDN网络,支持的流量超过800Gbps。淘宝的搜索引擎能够对数十亿的商品数据进行实时搜索,另外还拥有自主研发的文件存 储系统和缓存系统,以及java中间件和消息中间件系统,这一切组成了一个庞大的电子商务操作系统。另外从商业数据上来看,AMAZON的财报显示 2011年完成了大约 480亿美金的交易额,EBAY2011年财报全年完成了大约600亿美金的交易额(不包括其独立的汽车交易平台)。不管从交易额、商品数量、同比增速等 指标上看,淘宝网均远超于此,是目前全球最大的电子商务平台。(由于淘宝非上市公司,未公布2011年业绩,以上内容来自淘宝网技术副总裁 @_行癫 的微博)
以上这些技术数据可能已经让一些同学产生不适的感觉,为了让更多的人读懂这本书,我们从技术的角度来看,小美访问淘宝网的时候,网站上发生了什么事情。下参考资料:《你刚才在淘宝上买了一件东西【技术普及帖】》,来自南京邮电大学孙放同学
为了有个更直观的对比,我们说一个同行,他在2011年光棍节之前做促销,流量上去之后,达到12Gbps(他们有这么大的流量,老板很高兴,在微博上面 说了这个数据),这时候流量达到了极限,网站几乎挂掉,用户无法下订单。而淘宝网光棍节当天网络的流量最高达到800多Gbps,带给各家银行和快递公司 的流量也让他们压力山大,如临大敌(后来,他们以能够撑住淘宝带来的流量为荣而到处宣传)。另外如果你在网上购买过火车票的话,更能体会到网站能支持多大 的流量有多重要。但这不是一朝一夕做出来的,也不是有钱就能办到的。
以上对比的这些网站,也许读者很容易就猜到是哪一家,这里拿出来作对比,绝对没有嘲笑人家的意思,采用通常的网站技术方案,能做到这种程度已经不错了。任 何网站的发展都不是一蹴而就的,在什么样的阶段采用什么样的技术。在发展的过程中网站会遇到各种各样的问题和业务带来的压力,正是这些原因才推动着技术的 进步和发展,而技术的发展又会反过来促进业务的更大提升。二者互为因果,相互促进。如今淘宝网的流量已经是全球排名第12、国内排名第3(美国的ebay 全球排名23,国内前两名是百度和腾讯)。淘宝网的系统也从使用一台服务器,到采用万台以上的服务器。本书就为大家描述淘宝网在整个发展过程中,所有的主 动和被动的技术变革的前因后果,这由很多有趣的故事组成。
正如同很多人或组织成功了以后,就会为自己的出身编造一个美丽的传说。淘宝网的出身,网上也有非常多的传说,下面我们就从它的出生开始讲起。
继续阅读:
二、个人网站
三、Oracle/支付宝/旺旺
四、淘宝技术发展(Java时代:脱胎换骨)
五、淘宝技术发展(Java时代:坚若磐石)
六、淘宝技术发展(Java时代:创造技术-TFS)
七、淘宝技术发展(Java时代:创造技术-Tair)
八、淘宝技术发展(分布式时代:服务化)
原文出处: http://blog.sina.com.cn/s/blog_633219970100x9cc.html