一、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);