__Strong&__Weak

/关键字: 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);

}

你可能感兴趣的:(__Strong&__Weak)