person.h
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN /* @propety 1.原子性 :atomic 线程安全 (默认) nonatomic 执行速度更快 2.对象的所有权 assign 基本数据类型 基本赋值操作 (默认) retain 获取对象所有权 copy 将复制一个新对象 3.生成存取方法的控制 readwrite、 两种方法都生成 (默认) readonly、 只生成getter方法 */ // mrc @interface Person : NSObject // 对象 retain 字符串 assgin @property(nonatomic,retain) NSString* name; -(instancetype)ininWithName:(NSString*)n; -(void)show; @end
person.m
#import "Person.h" //@synthesize name=_name; @implementation Person //assgin //-(void)setName:(NSString*)n //{ // _name=n; // //} //retain //-(void)setName:(NSString*)n //{ //if(_name!=n) 判断两个对象是不是一个对象 //{ // [_name release]; 释放旧对象 // _name=[n retain]; 获取新对象的所有权 // //} //} //copy //-(void)setName:(NSString*)n //{ //if(_name!=n) 判断两个对象是不是一个对象 //{ // [_name release]; 释放旧对象 // _name=[n copy]; 复制出一个新对象 // //} //} -(instancetype)ininWithName:(NSString*)n { self=[super init]; if(self) { // _name=n; //assign 没有对象全权限 mrc _name=[n retain]; //retain 如果一个类有一个对象成员 在使用指针使用retain 方法 } return self; } -(void)show { NSLog(@"name:%@",_name); } -(void)dealloc { [_name release]; [super dealloc]; } @end
main
#import <Foundation/Foundation.h> #import "Test.h" #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { // // // oc中可变对象适用于引用计数 不可变对象不可用于引用计数 // // 常量字符串 //1. 使用常量字符串 Person* p =[[Person alloc]ininWithName:@"zhangsan"]; [p show]; // 2.可变字符串 NSMutableString* str1=[[NSMutableString alloc]initWithString:@"zhangsan"]; NSLog(@"retaincount=%lu",[str1 retainCount]); Person* p2=[[Person alloc]ininWithName:str1]; NSLog(@"retaincount=%lu",[str1 retainCount]); [str1 release]; NSLog(@"retaincount=%lu",[str1 retainCount]); [p2 show]; //3. NSMutableString* str2=[[NSMutableString alloc]initWithString:@"lisi"]; /* -(void)setName:(NSString*)n { if(_name!=n) { [_name release]; _name=[n retain]; } } 泄漏 str1 */ [p2 setName:str2]; [str2 release]; [p2 show]; [p2 release]; // NSLog(@"retainCount=%lu",[str1 retainCount]); } return 0; }
原文:https://www.cnblogs.com/zhangqing979797/p/13257930.html