OC学习笔记

一、ARC 命名规则注意:
1、属性名称不能以new开头,比如@porperty NSString *newString 是不允许的。
2、属性不能只有一个read-only而没有内存管理特性。如果没有启用ARC,可以使用@property (readonly) NSString *title语句。但是如果启用了ARC,就必须指定由谁来管理内存。因为默认特性是assign(弱引用),所以你可以进行一个简单的修复,使用unsafe_unretained就好了。

同样强引用也有自己的——strong关键字和strong特性,内存关键字互斥,不能同时使用两个。
ARC不是垃圾回收(作用于运行时),ARC是在编译的时候插入retain和release语句

ROP-可保留对象指针
不能对ARC管理的对象调用的管理方法:
retain retainCount release autorelease dealloc

二、strong 和 copy
      1. strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
     2. copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property。
@interface Person : NSObject
@property (strong, nonatomic) NSArray *bookArray1;
@property (copy, nonatomic) NSArray *bookArray2;
@end

@implementation Person
//省略setter方法
@end

//Person调用
main(){
    NSMutableArray *books = [@[@"book1"] mutableCopy];
    Person *person = [[Person alloc] init];
    person.bookArray1 = books;
    person.bookArray2 = books;
    [books addObject:@"book2"];
    NSLog(@"bookArray1:%@",person.bookArray1);
    NSLog(@"bookArray2:%@",person.bookArray2);
}
使用strong修饰的person.bookArray1输出是[book1,book2],而使用copy修饰的person.bookArray2输出是[book1]。这下可以看出来区别了吧。

备注:使用strong,则person.bookArray1与可变数组books指向同一块内存区域,books内容改变,导致person.bookArray1的内容改变,因为两者是同一个东西;而使用copy,person.bookArray2在赋值之前,将books内容复制,创建一个新的内存区域,所以两者不是一回事,books的改变不会导致person.bookArray2的改变。

三、选择器

 指令@selector()表示使用编译的选择器,而不是完整的方法名称。如下,setWidth:height:的选择器被赋值给了setWidthHeight变量:
SEL setWidthHeight;
setWidthHiehgt = @selector(setWidth:height:);
         在编译时使用@selector指令来给SEL类型的变量赋值是效率最高的。然而,在某些情况下,可能需要将字符串转换成运行时的选择器。此时可以使用NSSelectorFromString函数来完成:
setWidthHeight = NSSelectorFromString(aBuffer);
        反向的转换也是可以的。函数NSStringFromSelector返回一个选择器对应的方法名称:
NSString * method;
method = NSStringFromSelector(setWidthHeight);

[friend performSelector:@selector(gossipAbout:) withObject:aNeighbot];
同:  [friend gossipAbout:aNeighbot];
如果没有参数,: [friend performSelector:@selector(gossipAbout:) withObject:nil];

四、协议
1、声明协议
@protocol  proName
-()方法
@end
2、继承协议
@protocol son  <parentPortocol>
@end
3、使用协议
@interface Car : NSObject <protocolName1, protocolName2 >
{
}
@end
五、代码块 block
声明和实现都需要 ^
例://< 返回类型> (^名称)  (参数列表)  = ^(参数列表){ 实现代码};
     int (^square_block)(int number) =    
          ^(int number ) { return (number*number); };
     int result = square_block(5);
//没有参数
 void (^theBlock)() = ^{code};

可以访问相同有效范围内的变量
但是,本地变量会被代码块作为常量获取,要修改,,除非定义成static,
int value = 6;  (static)
int (^…)(int xx) = ^(int xx){ return value*xx };——6
value=99;
…(xx)——6*xx;
修改 —>> __block double c=3
c = xxx(1*2);

关键字 typedef 
typedef double (^xxxxxxxx) (double c ,double d)
例:
xxxxxxxx myblock = ^(double c,double d){…};
六、添加异步代码,参数:队列和代码块(dispatch_block_t)类型
dispatch_async(_serial_queue,^{xxxx;});
或者  dispatch_block_t myBlock = ^{xxx;};
          dispatch_async(_serial_queue,myBlock);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值