OC基礎 @Property幾種屬性
阿新 • • 發佈:2020-07-08
mrc模式下
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; }