1. 程式人生 > 實用技巧 >OC基礎 @Property幾種屬性

OC基礎 @Property幾種屬性

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;
}