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

ARC

/*arc中的property属性
 生成setter方法的类型:
 strong 强引用  retained 获取对象的所有权
 unsafe_unretained 赋值。assign 赋值
 weak 弱引用。当原始对象被小销毁后自动变成nil
A类。                B类
B类对象成员 _b        A类对象成员 _a
A* a;
B* b;
 a.b =b;
 b.a=a;
交叉引用:如果两个对象分别包含彼此的强引用, 会出现无法销毁的对象 因此使用到了弱引用

 */

/*
 OC中的内存释放原则
 1.谁创建 谁释放 :使用alloc copy nutablecopy 开头创建的对象都需要自己释放
 2.使用retain获得的对象所有权,在不用了之后也要释放掉
 3.不是上边两条得到的对象,不要去释放它 (否则会造成过度释放)
 
 */

/*
 
 什么是延迟释放。解决:自动释放池
 通过类方法创建的对象
 NSString* str1=[NSString stringWithFormat:@"%d",10]
 
 */
//@property(nonatomic,strong)NSString* name;
//@property(nonatomic,unsafe_unretained)int age;
原文地址:https://www.cnblogs.com/zhangqing979797/p/13257930.html