/关键字: OC (Objective - C )保留的一些单词
//对象的管理权:管理对象是否释放的权限
//__weak修饰的指针,如果指向刚创建好的对象,则这个对象在创建成功后立即释放
//__weak指向的对象释放之后,指针置为nil,空指针nil可以做任何事,但是调用不会触发事件即调用不成功
//弱指针主要的作用是引用对象
//成员变量依附于viewController对象,当viewController对象释放的时候,这些成员变量及属性也跟着释放
//成员变量释放方式
//1.置空nil:强制释放
//_peopleNormalPeople = nil;
//声明成员变量
/*
__strong :强指针拥有对象的管理权
__weak:弱指针不拥有对象的管理权
原理:当一个对象有强指针指向的时候,对象不会释放,当没有强指针指向的时候会立即释放
默认情况下是:__strong
*/
__strong People* people;//等价于People* peopel;
__weak People* people1;
//__strong :强指针拥有对象的管理权
@property (nonatomic,strong) UIView* view;
//__weak:弱指针不拥有对象的管理权
@property (nonatomic,weak) UIView* view1;
//copy和MRC中的作用相同
//修饰实现NSCoping协议的那些类
@property(nonatomic,copy) NSString* name;
//unsafe_unretained:不安全不拥有对象管理的修饰
//一般修饰基本数据类型,但是不用
@property (nonatomic,unsafe_unretained) int age;
//在ARC中retain依然有效,只不过在编译时会把retain换为strong
@property (nonatomic,retain) UIView* view2;
//在ARC中assign依然有效,只不过在编译时会把assign换为unsafe_unretained
@property (nonatomic,assign) int count;
//改变%@格式符输出对象的内容
- (NSString *)description{
return [NSString stringWithFormat:@"<%@ :%p>",self.name,self];
}
//使用weak是为了防止出现循环调用
//@property (nonatomic,weak) People * friend;
//循环引用的解决方法
//1.解开环状引用
//People.friends = nil;
//2.属性声明为weak
//使用assign是为了防止循环使用
@property (nonatomic,assign)id delegate;
//在ARC工程中使用MRC要在build phrase中的该类的.m之后加:-fno-objc-arc
//在MRC工程中使用ARC要在build phrase中的该类的.m之后加:-fobjc-arc
//弱指针打印输出时,我们为了防止在输出时被释放掉,会暂时retain一下,弱指针输出完再释放掉
//p1 :如果是弱指针指向p1,引用计数不变。如果是强指针指向p1 ,引用计数+1
#pragma mark === __bridge
- (void)testCastBridge{
People *people = [[People alloc] initWithNmae:@"局部用于测试_bridge的强2指针"];
//将OC指针转化C指针__bridge:没有发生对象管理权的转换
void *peopelPtr = (__bridgevoid*)(people);
NSLog(@"+++%@",people);
//将C指针转化为OC的指针__bridge:没有发生对象管理权的转化
__weak People*p1 = (__bridgePeople*)(peopelPtr);
#pragma unused(p1)
NSLog(@" +++++ %@",people);
}
#pragma mark ==== __bridge_tranfer
-(void)testCastBridgeTranfer{
NSLog(@"前_strong1 = %@ ",voidPeopel);
voidPeopel=nil;
//__bridge_tranfer:将指针转化为OC指针同时将对象的管理权交回给ARC
__weakPeople* people = (__bridgePeople*)(voidPeopel);
CFBridgingRelease(voidPeopel);
NSLog(@"后_string1 = %@",voidPeopel);
}
#pragma mark === BridgeRetain
- (void)testCastBridgeRetain{
People *people = [[People alloc] initWithNmae:@"用于测试__bridge_retain的局部强指针"];
//__bridge_retained将OC指针转化为C指针同时转交对象的管理权-> RC +1
void *peopelPtr = (__bridge_retained void *)people;
NSLog(@"__bridge_retained------%@",people);//2
//不能使用__bridge_retained将C指针转化为OC指针。单向的转化
//people * p1 = (__bridge_transfer People *)peopelPtr;
//在桥接过程中我们要手动管理C指针用完之后释放
CFRelease(peopelPtr);
NSLog(@"__bridge_retained------%@",people);//1
void *p2 =CFBridgingRetain(people);
#pragma unused (p2)
NSLog(@"3--__bridge_retained------%@",people);//2
}
#pragma mark === C中基本测试指针
- (void)testTypeCastC{
int num = 456;
NSLog(@"num ---- %d",num);
//numPrt整型指针
//&:取址运算符&X取num得内存地址
int* numPtr = #
NSLog(@"numPrt = %p",numPtr);
//*:间接寻址运算符取指针指向的内存地址中的值
NSLog(@"numPrt's value = %d",*numPtr);
//关系
//num = *numPtr;
//numPrt = #
//void *:声明一个名为voidPrt无类型指针(不限类型指针)
void* voidPrt = #
NSLog(@"---%p",voidPrt);
int* voidPrt_int = (int*)voidPrt;
NSLog(@"-----%d %d",*(int*)voidPrt,*voidPrt_int);
}