关键字的描述
//strong: 用于表明该指针是一个强指针, 由它指向的对象不会被释放. 描述一般的OC对象的时候, 使用strong. 但是在ARC下, 仍然可以使用retain, 但是编译器在编译的过程中, 会自动把retain变为strong.
@property (nonatomic, strong)NSArray *array;
@property (nonatomic, retain)UILabel *label;
//使用基本数据类型和结构体的时候, 会使用unsafe_unretained.
@property (nonatomic, assign)int age;
//unsafe_unretained: 和assign类似, 也不会对对象的内存产生影响. 但是描述基本数据类型和结构体如果使用assign的话, 系统会自动编译为unsafe_unretained这个关键字.
@property (nonatomic, unsafe_unretained)float weight;
//copy这个关键字在ARC下基本功能和MRC下是一样,功能被保留.
@property (nonatomic, copy)NSString *name;
//weak: 在描述代理的时候, 或者在进行XIB连线控件的时候, 通常是weak. 不会导致对象的引用计数+1;
//在描述delegate对象的时候, 一般不适用assign和unsafe_unretained, 就是因为weak除了不会让对象的引用计数+1之后, weak还有一个特殊的功能, 当一个对象被释放的时候, 用weak修饰的指针会自动置为nil.(可以防止野指针的出现), 一个空对象可以调用任何方法都不崩溃.
//unsafe_unretained: 通过它描述的指针, 一旦它指向的对象被释放后, 指针不会自动置为nil.
@property (nonatomic, weak)id delegate;
ARCdealloc方法的使用注意事项
#import "People.h"
@implementation People
//当前类的dealloc方法, 会在当前类的对象被释放的时候被调用, 一般不要手动的调用dealloc方法.
//dealloc方法不仅仅可以在MRC环境下使用, 使用时候注意, 在dealloc方法内部需要添加[super dealloc].
//同样也可以在ARC环境下使用, 注意, 不能方法内部添加[super dealloc], 因为我们不需要再调用release, autorelease等方法了.
- (void)dealloc
{
NSLog(@"people对象被释放了");
}
@end
OC与C对象的互转(以及他们的管理权限问题)
#import "ViewController.h"
#import "People.h"
@interface ViewController ()
{
void *_CFPeople;
People *_people;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
People *people = [People new];
//OC-->C: __bridge, __bridge_retained
//void *: Core Foundation下的一个指针类型, 类似于Foundation下的id, 万能指针, 可以指向任何对象.
//__bridge: 是由OC对象转化为C对象的一种方式, 使用这种方式, 就是在告诉编译器, 只转换类型, 不转化对象内存的管理权限.表明对象的内存管理权限仍然在ARC手中.
//void *CFPeople = (__bridge void *)people;
//_CFPeople = (__bridge void *)people;
//CFRetain(_CFPeople);
//__bridge_retained: 告诉编译器不仅仅转化对象的类型, 同时让对象的内存管理权有Foundation下的ARC管理转到Core Foundation下进行手动管理.
//void *CFPeople = (__bridge_retained void *)people;
//由于对象内存的管理权, 已经转到了Core Foundation下, 所以需要手动调用CFRelease来释放一个局部对象.
//CFRelease(CFPeople);
//全局变量的释放
//_CFPeople = (__bridge_retained void *)people;
//汉字转拼音
NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"张三"];
//转化成Core Foundation对象
CFMutableStringRef string = (__bridge CFMutableStringRef)mutableString;
//调用汉字转拼音的函数
CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
//去音符
CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
//转化完成之后, 需要把Core Foundation对象重新转化为OC对象
mutableString = (__bridge NSMutableString *)string;
NSLog(@"mutableString = %@",mutableString);
//在ARC和MRC进行混编的时候, 注意:
//如果在ARC环境下, 使用支持MRC的文件, 需要给每一个文件配置-fno-objc-arc.
//如果在MRC环境下, 使用支持ARC的文件, 需要给每一个文件配置-objc-arc.
}
- (void)dealloc
{
NSLog(@"VC 被释放了");
CFRelease(_CFPeople);
}
- (IBAction)btn:(id)sender {
// UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
// window.rootViewController = nil;
//C-->OC: __bridge, __bridge_transfer
//只转换对象的类型, 不转换对象的内存管理权限.管理权仍然在Core Foundation下.
//People *people = (__bridge People *)_CFPeople;
//对象类型转化之后, 需要手动的对Core Foundation对象进行CFRelease的操作.
//CFRelease(_CFPeople);
//_people = (__bridge People *)_CFPeople;
//__bridge_transfer: 不仅仅转化对象的类型, 同时把对象内存的管理权限转交给了ARC进行管理.
//接下的操作, ARC就开始管理这个OC对象了.
//People *people = (__bridge_transfer People *)_CFPeople;
//交换管理权到ARC手中 __bridge_transfer:对对象的引用计数-1.
//_people = (__bridge_transfer People *)_CFPeople;
}
@end
网友评论