基础:http://blog.csdn.net/dirknow/article/details/6602655
编码规范:http://mobile.51cto.com/iphone-223176_all.htm
内存管理,引用计数:http://mobile.51cto.com/iphone-220322.htm
iPhone应用程序解密:http://mobile.51cto.com/iphone-222172.htm
Object-C:
1、使用#import引入头文件(相同头文件只会引用一次)
2、NSString 指针类型
3、NSLog 输出日志
4、BOOL两状态YES NO
5、方法调用:Shape shape = new Shape(); [object methodName] //OC中对象调用方法,[对象 方法名]
6、方法声明:
-(void) draw; “-”表示Object-C方法声明 “+”表示静态方法,”(void)”表示没有返回类型,”draw”方法名
-(void)setFillColor:(ShapeColor) fillColor; 冒号后面表示方法参数 ShapeColor 类型 fillColor 参数名
7、中缀符
[circle setFillColor: kredColor]; 调用带一个参数的方法
[textThing setStringValue:@“hello there”color:kNlueColor];调用带两个参数的方法
8、方法实现:
-(void) draw{}//draw
-(void) setBounds:(ShapeRect) b{bounds = b;}
56页 http://download.csdn.net/detail/prettystony/8599925
9、实例化
id circle = [Circle new] [类型 new关键字] 表示已经实例化了一个对象 ,id指向任意类型对象的指针,相当于var
10、创建类
@interface Circle : NSObject //interface 类名声明 、Circle 类名 、”:“继承 、NSObject 基类
{
@private
ShapeColor fillColor;//成员变量
ShapeRect bounds;
}
-(void) setFillColor : (ShapeColor)fillColor;//方法声明
-(void) draw;
@end //Circle
//类实现
@implementation Circle
-(void) setFillColor:(ShapeColor) c
{
fillColor = c;
}// setFillColor
11、继承
[super circle:kRed]
12、复合
@interface Unicycle : NSObject
{
Pedal *pedal;
Tire *tire;
}
@end //Unicyle
int main(int argc,const char *argv[])
{
Car *car;
car = [Car new];
[car print];
return(0);
}//main
13、#import <Fountation/Fountaiton.h>//系统头文件
#import “Test.h”//用户自定义头文件
【注意】#import 和@Class的区别:
*1、import包换这个类的所有信息,即属性和方法,@Class告诉编译器后面声明的是类名称,至于类是如何实现的暂时不考虑
*2、在头文件中一般只需要知道被引用的类的名称就可以所有会用@Class,而在.m文件中实现时则需要#import类
*3、在编译效率方面,如果A->B B->C C->D这样的话A发生变化,则所有文件都需要重新编译一次,使用@Class则不会
*4、如果有循环依赖 A->B B->A,如果使用#import相互包含则会报错,使用@Class则不会
一般,@Class是放在interface中,只是为了在interface中引用这个类,在实现这个接口的实现类中如果需要使用这个类的属性或者方法,则需要使用#import引入该类
14、继承试先引用基类的头文件,然后再继承基类;实现的时候只需要引入当前类的头文件,不需要引入Cocoa的系统头文件
15、每个类都有两个文件:包含类@interface部分的头文件和包含@implementation部分的.m文件。类的使用者可以通过#import命令导入头文件来获得该类的功能。
98页 http://download.csdn.net/detail/prettystony/8599925
16、Xcode 修改类名 :打开.h文件,然后选择Edit->Refactor->Rename
17、Command+shift+O 快速打开某个源文件
18、屏幕够大,开启辅助窗口 View->Assistant->Show Assistant Editor
19、Xcode调试
20、快捷键
Esc建 显示代码提示菜单
Control + K 删除本行
21、结构体NSRange
由于性能方面的要求,如有许多临时坐标、大小和矩形区域 则最好用结构体,不用动态分配内存
22、字符串
NSString %@ 表示
a、创建字符串:
+(id) stringWithFormat:(NSString *)format,…; “+”表示静态函数 ,类方法“-”表示Cocoa的函数,和公有私有方法没有关系
NSString *height;
height = [NSString stringWithFormat:@“Your height is %d feet,%d inches”,5,11];
123页 http://download.csdn.net/detail/prettystony/8599925
b、获取字符串长度
-(NSUInteger) length;
NSUInteger length = [height length];
c、字符串比较
-(BOOL) isEqualToString:(NSString *) aString; // 比较两个字符串相等时应该使用sEqualToString,”==”只判断两字符串的指针数值而不是它们所指的对象
NSString *str1 = @“hello 5”;
NSString *str32 = [NSString stringWithFormat:@“hello %d”,5];
if(str1 isEqualToString:str2){
NSLog(@“This is the same string.”);
}
//如果要检查两个对象str1和str2是否为同一事物应该使用==,如果想查看字符串内容是否相同,应该使用isEqualString
d、字符串比较Campare()
-(NSComparisonResult) compare:(NSString *) aString;
compare:将接收对象和传递过来的字符串逐个进行比较,它返回一个NSComparisonResult(也是一个enum枚举)来显示比较结果
enum
{
NSOrderedAscending = -1,//str1比str2顺序靠前
NSOrderedSame,//str1比str2顺序相等
NSOrderedDescending//str1比str2顺序靠后
};
typedef NSInteger NSComparisonResult;
e、不区分大小写的比较
-(NSComparisonResult) compare:(NSString *) aString options:(NSStringCompareOptions) mask;
//NSCaseInsensitiveSearch:不区分大小写字符
//NSLiteralSearch:进行完全比较,区分大小写字符
//NSNumericSearch:比较字符串的字符个数,而不是字符串值。如果没有这个选项,100会排在99的前面,
if ([str1 compare:str2 options:NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame) {
NSLog(@"same ");
}else{
NSLog(@"not");
}
f、判断字符串头尾是否包含相应的字符串
-(BOOL) hasPrefix:(NSString *) aString;//是否包含前缀
-(BOOL) hasSuffix:(NSString *) aString;//是否包含后缀
if([str1 hasPrefix:@“hello”]){
NSLog(@“前面相同”);
}
if([str1 hasSuffix:@”5”]){
NSLog(@“后面相同”);
}
-(NSRange) rangeOfString:(NSString *) aString;
//如果传递的参数在接收字符串中没有找到,则range.location等于NSNotFound
if(str1 rangeOfString:@“llo”){
NSLog(@“local %lu length %lu”,range.location,range.length);//location返回字符串位置,length返回字符串长度
}
g、可变性
NSString是不可变(immutable)的,一旦创建就不能改变
+(id) stringWithCapacity:(NSUInteger) capacity;
-(void) appendString:(NSString *) aString;
-(void) appendFormat:(NSString *) format,…;
-(void) deleteCharactersInRange:(NSRange) aRange;//删除字符串中的字符
NSMutableString *string = [NSMutableString stringWithCapacity:30];
[string appendString:@"this is a test "];
[string appendFormat:@"and %d age",5];
NSLog(@"%@",string);
NSRange range = [string rangeOfString:@"and"];
range.length++;
[string deleteCharactersInRange:range];
NSLog(@"second %@",string);
NSMutableString *string = [NSMutableString stringWithFormat:@"sdf”];//输入可变字符串
NSLog(@"sdf %@",string);
23、集合大家族
a、NSArray 不可变数组:
只能存储Obejct-C的对象,不能存储原始的C语言基础数据类型,如int、float、enum和NSArray中的随机指针
不能存储nil(对象的零值或NULL值)
创建NSArray,在列表结尾添加nil代表列表结束,循环以nil结束
NSArray *array = [NSArray arrayWithObject:@“one”,@“two”,nil];
NSArray *array2 = @[@“one”,@“two”];//使用字面量语法不必在结尾处添加nil
// -(NSUInteger) count; 获取长度
// -(id)objectAtIndex:(NSUInteger) index 得到指定元素对象
for (NSUInteger i=0; i<[array1 count]; i++) {
NSLog(@"array index %lu content %@",(unsigned long)i,[array1 objectAtIndex:i]);
}
for (NSUInteger i=0; i<[array2 count]; i++) {
NSLog(@"array index %lu content %@",(unsigned long)i,array2[i]);
}
//字符串切分成数组
NSString *string = @"a:b:c:d";
NSArray *array = [string componentsSeparatedByString:@":"];
for (NSUInteger i=0; i<[array count]; i++) {
NSLog(@"array content %@",array[i]);
}
//数组合并成字符串
string = [array componentsJoinedByString:@"*"];
NSLog(@"new string %@",string);
132页
b、NSMutableArray可变数组
NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
NSLog(@"count111 %lu",(unsigned long)[array count]);
for (NSUInteger i=0; i<4; i++) {
NSString *str = [NSString stringWithFormat:@"string %lu",(unsigned long)i];
[array addObject:str];
}
for (NSUInteger i=0; i<4; i++) {
NSLog(@"count %@",array[i]);
}
-(void) removeObjectIndex:(NSUInteger) index;
[array removeObjectIndex:1];
c、枚举 //使用枚举遍历数组
-(NSEnumerator *) objectEnumerator;
for (NSString *string in array) {
NSLog(@"strings %@",string);
}
四种遍历数组的方法:索引、使用NSEnumerator、快速枚举、最新代码快方法
d、NSDictonary 不可变长度
NSString *str1 = @"one";
NSString *str2 = @"two";
NSString *str3 = @"three";
NSString *str4 = @"four";
NSDictionary *dictionary = @{@"1":str1,@"2":str2,@"3":str3,@"4":str4};
NSLog(@"dictinoary1 %@",[dictionary objectForKey:@"1"]); NSLog(@"dictinoary2 %@",dictionary[@"1"]);
NSArray 和NSDictionary只能存储对象
e、NSNumber
144页 http://download.csdn.net/detail/prettystony/8599925
24、内存管理
a、-(id) autoRelease; //自动释放池
@autoReleasePool{}关键字
NSAutoReleasePool对象 创建自动释放池
NSAutoReleasePool *pool;
pool = [NSAutoReleasePool new];
…
[pool release];
b、Cocoa的内存管理
*1、当你使用new、alloc或copy方法创建、获得一个对象时,该对象的保留计数器的值为1。当不再使用该对象时,你应该向该对象发送一条Release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
*2、当你通过其他方法获得一个对象时,假设该对象的保留计数器的值为1,而且已经被设置为自动释放,那么你不需要执行任何操作来确保该对象得到清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
*3、如果你保留了某个对象,就需要(最终)释放或自动释放该对象。必须保持retain方法和Release方法的使用次数相等。
e.g1.:使用new、alloc或copy方法获得的对象,就需要安排好该对象的内存释放,通常使用Release消息来实现
NSMutableArray *array;
array = [[NSMutable alloc] init];//Count 1
// use the array
[array release];//count 0
eg2:如果使用其他方法获得一个对象,比如arrayWithCapacity:方法,则不需要去关心如何销毁该对象。
NSMutableArray *array;
array = [NSMutableArray arrayWithCapacity 17];
// count: 1,autoReleased
//use the array
arrayWithCapacity:方法与alloc、new、copy这三个方法不同,因此可以假设该对象被返回时保留计数器的值为1且已经被设置为自动释放。当自动释放池被销毁时,向array对象发送Release消息,该对象的保留计数器的值归0,其占用的内存被回收。
eg3:使用NSColor类对象的部分代码如下:
NSColor *color;
color = [NSColor blueColor];
//use the color
blueColor 方法也不属于alloc、new、copy这三个方法,可以假设该对象的保留计数器的值为1并且已经被设置为自动释放。blueColor方法返回一个全局单例对象,每个需要访问它的程序都可以共享的单一对象,不需要手动释放。
c、拥有对象:你可能希望在多段代码中一直拥有某个对象。在该类的dealloc方法中调用对象的Release方法。
-(void) doStuff
{
flonkArray = [NSMutable new];//count 1
}
-(void) dealloc
{
[flonkArray release];
[super dealloc];
}
d、在事件循环中如GUI程序(点击鼠标或按下某个按键)以前,程序将一直处于空闲状态。当发生这样的事件时,程序将被唤醒并开始工作,执行必要的操作以响应这一事件。在处理完这一事件后,程序返回到休眠状态并等待下一个事件发生。为了降低程序的内存空间占用,Cocoa会在程序开始处理事件之前创建一个自动释放池,并在事件处理结束后销毁。这样可以尽量减少累积的临时对象的数量。
当使用自动释放对象时,前面的方法可以按如下形式重写。
-(void) doStuff
{
//flonkArray is an instance variable
flonkArray = [NSMutableArray arrayWithCapacity: 17];
//count:1.autoreleased
[flonkArray retain];//count:2,1 autorelease
}
-(void) dealloc
{
[flonkArray release];
[super dealloc];
}
在当前事件循环结束(如果这是一个GUI程序)或自动释放池被销毁时,flonkArray对象会接收到一条Release消息,因而其保留计数器的值从2减少到1。因为其保留计数器的值大于0,所以该对象将继续存在。因此,我们需要在自己的deallocl方法中释放它,以便它被清理。
自动释放池被清理的时间是完全确定的:要么是在代码中你自己手动销毁,要么是使用AppKit时在事件循环结束时销毁。
e、垃圾回收: OS X应用
垃圾回收功能只支持OS X应用开发,无法用在iOS应用程序上。苹果公司建议你不要在自己的代码中使用autorelease方法,也不要使用返回自动释放对象的一些便利方法,这些便利方法都会返回一个新对象的类方法。比如NSString,所有以stringWith开头的方法都是便利方法。
f、自动引用计数(ARC): iOS应用。ARC会追踪你的对象并决定哪一个不会再用到,如私人管家。ARC不是垃圾回收器,垃圾回收器实在运行时工作,通过返回的代码来定期检查对象。ARC是在 编译时进行工作的。它在代码中插入了合适的retain和Release语句,就像你自己动手写好了所有内存管理代码。不过,是编译器替你完成了内存管理工作。程序在运行的时候,retain和Release会像往常一样发挥作用。
在代码中使用ARC的条件:
*1、能够确定哪些对象需要进行内存管理;
*2、能够表明如何去管理对象;
*3、有可行的办法传递对象的所有权。
垃圾回收器和ARC无法同一使用
166页 不懂
25、异常 //168页 http://download.csdn.net/detail/prettystony/8599925
异常的所有关键字都是以@开头
26、对象初始化 //171页
BOOL 为NO,int为0,float初始化为0.0,指针为nil
Object-C初始化分为两步:分配和初始化
Car *car = [Car alloc]; //这样的代码也许能运行,但由于未进行初始化,可能会出现奇怪的Bug
*1、初始化对象
Car *car = [[Car alloc] init];
27、APPKit 244页 OS X使用APPKit框架
28、UIKit 258页 iOS 使用UIKit框架
29、文件加载与保存 277页