OC学习总结(二)

来源:互联网 发布:房屋平面图制作软件 编辑:程序博客网 时间:2024/05/24 05:23
OC学习总结(二)
 (一)内存管理
            内存管理规范:

         1、只要调用了alloc,必须有releaseautorelease

         2set方法的代码规范

            1>基本数据类型:不需要内存管理,直接赋值

             - (void) setSpeed:(int) speed

             {

                 _speed = speed;

             }

            2>OC对象类型

             - (void) setCar:(Car *) car

             {

             //判断传进来的对象是否是当前正在使用的对象

                 if (car != _car)

                 {

                     //对当前正在使用的车进行一次release(计数器减1

                     [_car release];

                     //对新车进行一次retain操作

                     _car = [car retain];

                 }

             }

         3dealloc方法的代码规范(不要直接调用dealloc方法)

            1>一定要[super dealloc],并且放到最后面

            2>self(当前)所拥有的其他对象做一次release

             - (void) dealloc

             {

                 //Person对象被回收之前对正在使用的对象进行一次release(计数器减1

                 [_car release];

                 NSLog(@"person对象被回收了");

                 [super dealloc];

             }


        @property参数分类

         1、内存管理相关参数

            retainrelease旧值,retain新值(适用于OC对象类型)

            assign:直接赋值(默认,适用于非OC对象类型)

            copyrelease旧值,copy新值

 

         2、是否生成set方法

            readwrite:同时生成settergetter方法的声明和实现(默认)

            readonly:只会生成getter方法的声明和实现(只读,一般用于不可修改的成员变量,如,人名、学号等)

 

         3、多线程管理

            nonatomic:性能高(一般就用这个)

            atomic:性能低(默认)

 

         4settergetter方法的名称

            setter:决定了setter方法的名称,一定要有冒号 :

            getter:决定了getter方法的名称(一般用于BOOL类型)


 ARC原理:无强指针指向的对象,就会释放内存回收对象

 

 指针分两种:1、强指针 __strong(默认情况下,所有指针都是强指针)

           2、弱指针 __weak

循环引用解决方案:一端用strong,另外一端用weakweak就是为循环引用准备的(ARC) 
               
一端用retain,一端用assign (无ARC)


(二)Block(类似C语言中指向函数的指针)

#import <Foundation/Foundation.h>


// 利用typedef定义block类型,感觉跟指向函数的指针类似,就是把变量标识给换了。。。

// typedef int (*MyPoint)(int, int);

typedef int (^MyBlock)(intint);


int main(int argc, const char * argv[]) {

    int a = 10;

    __block int b = 20;

    

    //无参数(可以省略右边^旁边的()号)

    void (^block)() = ^

    {

        //a = 20; block内部不能直接修改外部的局部变量,写出来就直接报错了。。。        

        //在变量前面加上__block关键字后,block内部便可修改了

        b = 8;        

        //block内部可以直接访问外部的局部变量

        NSLog(@"a = %d", a);

        NSLog(@"b = %d", b);        

    };

    block();

    

    //有参数

    void (^printLine)(int) = ^(int n)

    {

        for (int i=0; i<n; i++)

        {

            NSLog(@"------------------");

        }

    };

    printLine(5);

    

    //block类型定义一个block变量然后实现它

    MyBlock sumBlock = ^(int a, int b)

    {

        return a + b;

    };

    NSLog(@"a + b = %d", sumBlock(108));

    

    return 0;

}  

(三)Protocol(协议,类似java中的接口(interface) 

/*

    1、使用场合

        代理设计模式

 

    2、基本用途

        》可以用来声明一大堆方法(不能声明成员变量,这点跟Category(分类)一样)

        》只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

        》只要父类遵守了某个协议,就相当于子类也遵守了

 

    3、协议中有两个关键字可以控制方法是否需要实现(默认是@required),在大多数情况下,用于程序员之间的交流(比如A写了某个协议给B用,B去实现的时候,如果有需要实现的方法而未实现,就会出现警告,B就知道这些方法是A想让他实现的)

 

    4、协议遵守协议

        》一个协议可以遵守其他多个协议,多个协议之间用逗号,隔开

        》一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

        @protocol 协议名称<协议1 协议2>

 */


#import <Foundation/Foundation.h>

//Protocol(协议)的定义格式

@protocol MyProtocol <NSObject> //基协议,类似继承中的基类NSObject,一般都会遵守基协议


//默认需要实现,不然会有警告

- (void) test1;

//需要实现,不然会有警告

@required

- (void) test2;

//实现与否均可,不会有警告

@optional

- (void) test3;


@end 


//实现与否均可,不会有警告

@optional

- (void) test3;


@end 


//需要实现,不然会有警告

@required

- (void) test2;


//实现与否均可,不会有警告

@optional

- (void) test3;


@end 


0 0
原创粉丝点击