Object--c

基础: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页
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值