首页 > 代码库 > 一小时学会object-c
一小时学会object-c
■ XCODE设置:
(1)把编译器中的“警告”,设置成错误级别。方法:build settings 搜索error->“treat warings as errors”,更改为true.
(2)xcode 快捷键:
ESC: 打开代码提示自动完成窗口
TABLE:补全自动提示
快照:command+ctrl+s
保存:command+s
撤销:command+z
运行:command+r
注释 command+/(支持块)
断点:command+\
缩进:command+[ 或 command+]
分析代码:command+shift+b(找到内存溢出问题)
跳转声明: command + 单击
清除控制台: control + k
添加书签 command+d
折叠 command+control+左箭头
屏开 command+control+右箭头
屏开所有 control+u
折叠方法 command+control+上箭头
展开方法 command+control+下箭头
折叠注释块 command+control+shift+上箭头
展开注释块 command+control+shift+下箭头
关闭:command+w
行首:command+左箭头
行尾:command+右箭头
搜索:command+f(当前打开文档)
替换:command+option+f(当前打开文档)
删除本行:ctrl+k
全部保存:command+alt+s
项目全局搜索与替换:command+shift+f(左侧工具栏放大镜,上下箭头可以更改搜索/替换状态)
■ 安装到IPHONE
(1)infor面板:Bunddler Identifier -> com.lipeng
(2)Building Settings面板:ALL->Code singing identify->com.lipeng
■ IPHONE开发:
文本框和lable标签,是IBOutLet,需要从XIB窗口的AppObject拖到InterfaceBulid的Window窗口
按钮,是IBAction,需要从InterfaceBulid的Window窗口拖到XIB窗口的AppObject
■ Foundation Kit教程(常用数据类型备忘)
(1)结构体: NSRange、NSPoint、NSSize
(2)字符串相关函数:
初始化:NSString *str1; str1=[NSString stringWithFormat:@"hello %d",5];
比较是否相等:isEqualToString
比较大小:str1 compare: str2 (结果为-1,0,1) 有可选项 options:(是否区分大小写和只比较字符串所含字符个数)
字符串包含:
开头:hasPrefix,结尾:hasSuffix,(这两种方式返回BOOL)
中间:rangeOfString,(此方式返回NSRange,range.start即为匹配索引指,没找到则start=NSNotFound)
另,NSString-》对应JAVA中的String,NSMutableString-》对应JAVA中的StringBuffer
(3)数组:
两个注意事项:1,只能放NSObject对象,而不能放基本数据类型(参考下文——封装基本数据类型)。2,可变数组是NSMutableArray(参考NSMutableString)
字符串分隔成数组: componentsSeparatedByString
数组合并成字符串: componentsJoinedByString
可变数组的初始化:
NSMutableArray *array;
array=[NSMutableArray arrayWithCapacity:10];
可变数组的增、删、查
增:[array addObject: whbobjectname]
删:[array removeObjectAtIndex:1]
查:[array objectAtIndex:i]
遍历数组示例(优先推荐快速遍历):
方法一:快速遍历示例(仅适用于Object-C2.0,Mac OSX 10.5以上版本,相当于其他语言中的foreach):
for(NSString *string in array) //in whbenum也可以
{
NSLog(@"I AM %@",string);
}
方法二:普通循环遍历
NSArray * array;
array=[NSArray arrayWithObjects:@"one",@"two",nil];// nil 代表数组的结尾(联想一下C语言)
int i;
int arrayCount=[array count];
for(i=0;i<arrayCount;i++)
{
NSLog(@"itme %d ",i,[array objectAtIndex:i]);
}
方法三:迭代子
NSEnumerator *whbenum;
whbenum=[array objectEnumerator];
id item;
while(item=[whbenum nextObject])
{
NSLog(@"item:%@",item);
}
(4)字典:
初始化:
NSMutableDictionary *tires;
tires =[NSMutableDictionary dictionary];//注意:不是new
增加字典元素:(key相同即为修改)
[tires setObject:whbojbectname forKey:@"whbkeyname"];
删除字典元素:
[tires removeOjbectForKey:@"whbkeyname"];
查找字典元素:(获取)
Tire *tire=[tires objectForKey:@"whbkeyname"]
(5)封装基本数据类型(NSArray和NSDictionary不支持基本数据类型,必须先封装):
NSNumber *number;
装箱:
number=[NSNumber numberWithInt:42];
拆箱:
[number intValue];
(6)NSValue(指针,是NSNumber的父类,使用方法类似于C语言中的&parm,取变量的内存地址,个人感觉不是很常用)
(7)NSNull用法:[NSNull null]
(8)文件操作
获取文件扩展名:[filename pathExtension]
二进制文件转换成文本文件:plutil -convert xml1 filename.plist
【字符串形式操作文件】:
NSString *filecontent;
写入:
[filecontent writeToFile:@"tmp/whb.txt" atomically:YES]
读取:
filecontent=[[NSString alloc] initWithContentsOfFile: @"tmp/whb.txt"];
【数组形式操作文件】:
NSArray *arraycontent;
arraycontent =[NSArray arrayWithObjects:@"1",@"2",nil];
写入:
[arraycontent writeToFile:@"tmp/whb.txt" atomically:YES]
读取:
arraycontent =[NSArray arrayWithContentsOfFile: @"tmp/whb.txt"];
(9)日期和时间
NSDate *date=[NSDate date];
NSLog(@"today is %@",date);
■ OOP 编程
方法:+(void) methordname +号表示是类的静态方法。
方法:-(id) init id型数据是指泛型对象指针。
if(self=[super init]) 完成了超类初始化和校正内存地址为当前新生成对象2个功能(因为super init不一定返回self呦)。
生成类的实例:[[ClassName alloc] init] 等价于 [ClassName new]
类属性的命名(不推荐):setPropety,Property(而不是getProperty,NS历史遗留问题,getMethord的形参,全部是指针类型)
类属性推荐方法如下:
.h属性定义:@property float whbProperty;
.m属性实现:@synthesize whbProperty;实现后,默认有一个setWhbProperty方法来设置属性值。
重写父类方法:[super funcname:parm]
一段完整代码实例:
@implementation Circle
-(void) setFillColor:(ShapeColor)c
{
if(c==redcolor)
{
c=greencolor
‘ }
[super setFillColor:c]
}
类实例方法内部调用:[self whbmethord] (这里的self,相当于其他语言的this)
其他注意事项
import头文件时,<>与“”的区别:前者表示是系统头文件,禁止修改,后者是你自己的项目头文件,可以修改。
@class ClassName; 是放在interface.h中的,只是为了在interface中引用这个ClassName类。@class主要实现循环引用包含关系。
import ClassName.h; 是放在implement.m中的。
■ KVC间接访问对象属性方式,意即:键值编码:setValue:forKey 和 valueForKey:
代码示例:
[car setValue:[NSNumber numberWithFloat:250.4] forKey:@"whbProperty"]
编译器将首先查找-setWhbPorperty的方法,如果不存在,则查找类实例变量是否有whbProperty。
注意:
(1)键路径编码的setValue:ForKeyPath:和valueForKeyPath:支持"."点语法路径访问。
(2)键路径编码支持一对多关系中的数学运算。(不推荐,效率有待商榷,编译器不能排错)
比如来汇总车库中所有汽车的行驶里数:
NSNumber *summiles;
summiles=[garage valueForKeyPath:@"cars.@sum.mile"];
其中与sum类似的函数还有:count,avg,max,min
■ 类别和协议
类别(category):
主要实现往一个现有类中增加新方法(只能增加方法,不能增加变量,增加方法时,会覆盖旧有同名方法)
定义实例代码:
@interface WhbClass(categoryName)
-(void) newMethordName;
@end
解释:往WhbClass类中增加一个newMethordName新方法,此类别的名称为categoryName
类别主要功能:分散单个大类文件,比如分离出categoryName.m
协议:
@protocal协议:类似于JAVA中的接口interface,定义与类别类似(@optional和@required)
使用协议实例代码:
@interface Car:NSObject<WhbProtocal1,WhbProtocal2>(即承诺要实现2个协议中的所有方法)
■ 谓词筛选过滤(即从集合当中,查找指定元素,如果是简单数组,可使用‘SELF CONTAINS‘关键字)
NSPredicate *predicate;
predicate=[NSPredicate predicateWithFormat:@"name==‘whbname‘"];
//其他运算符实例:car.age>10 && car.age<20 等价于 car.age BETWEEN{10,20}(car 可用 SELF替换)
BOOL match=[predicate evaluateWithObject:car];
NSLog(@"%s",(match)?"YES":"NO");
NSArray *cars=[garage cars];//设置一个等待搜索的大集合
方法一:
//集合筛选-》从集合当中,查找指定元素
//一般的for遍历方式____begin
for(Car *car in cars)
{
if([predicate evalueWithObject:car])
{
NSLog(@"%@",car.name);
}
}
//一般的for遍历方式____end
//方法二:
//集合筛选-》从集合当中,查找指定元素,组成新集合
NSArray *resultArray;
resultArray=[cars filteredArrayUsingPredicate:predicate];//提示:一个filteredArrayUsingPredicate代替了for循环的3条语句
NSLog(@"%@",resultArray);
如果是想打印所有car对象的某个属性,则用如下方式:
NSArray *names;
names=[resultArray valueForKey:@"name"];
特别说明:方法一,方法二运行效率一致。
■ 内存管理(重要):
自动释放池(必须自己创建,可以有多个,栈形式):
NSAutoreleasePool *pool;
pool=[[NSAutoreleasePool alloc] init];
......
[pool release];
特别注意:(1)drain只适合于10.5以上版本(2)drain只是清空池,并不释放池本身
内存管理规则:
如果使用new,alloc,copy三个方法其中的任何一个,必须使用release 显示释放内存,其余则由系统自动管理即可。
另,如果你想一直拥有某个对象,则需要在dealloc中释放即可。
特别注意:
如果在某个类的实例方法中,将某个类实例属性用new,alloc,copy三个方法其中的任何一个进行了初始化,
那么必须在该类实例的dealloc方法中,显示释放该对象,用法示例如下:
-void dealloc
{
[whbProperty realease];
[super dealloc];
}
其他注意事项:
whbProperty=nil;//并不能释放内存,仅仅是将指向实体对象的指针,指向了nil,而实体对象本身直接内存泄露
================以下仅供备忘参考,不经常使用
防止内存泄露的方法:
-void setEngin:(Engine *)newEngine
{
[newEngine retain];
[engine release];
engine=newEngine;
}
自动释放资源(苹果不建议用,详见三条规则):
NSString *description;
[description autorelease]; //并不增加计数器的计数
开启垃圾回收机制(10.5以上版本适用,注意不支持ipone开发)
build选项卡-》Setting-》Object-c carbage Collection-》设置为required[-for-gc-only]
■ 函数集锦
//16进制颜色转UICOLOR
+(UIColor *) colorWithHexString: (NSString *) stringToConvert
{
NSString *cString = [[stringToConvert stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
// String should be 6 or 8 characters
if ([cString length] < 6) return [UIColor blackColor];
// strip 0X if it appears
if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];
if ([cString hasPrefix:@"#"]) cString = [cString substringFromIndex:1];
if ([cString length] != 6) return [UIColor blackColor];
// Separate into r, g, b substrings
NSRange range;
range.location = 0;
range.length = 2;
NSString *rString = [cString substringWithRange:range];
range.location = 2;
NSString *gString = [cString substringWithRange:range];
range.location = 4;
NSString *bString = [cString substringWithRange:range];
// Scan values
unsigned int r, g, b;
[[NSScanner scannerWithString:rString] scanHexInt:&r];
[[NSScanner scannerWithString:gString] scanHexInt:&g];
[[NSScanner scannerWithString:bString] scanHexInt:&b];
return [UIColor colorWithRed:((float) r / 255.0f)
green:((float) g / 255.0f)
blue:((float) b / 255.0f)
alpha:1.0f];
}
乱七八糟: id shapes[3];//定义一个对象数组,里面存各种不同的对象,初始化方法参照:
shapes[0]=[Circle new];
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。