OC学习之道:关于OC的属性的介绍

本人最纠结的就是属性的一些细节,看注释

//
//  main.m
//  Copyright (c) 2015年 tongxing. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Student.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        
       
 
#pragma mark----@property的使用
    
        //属性的使用
        //属性是Objective-C 2.0定义的语法,为实例变量提供了setter、 getter⽅方法的默认实现
//        属性的声明:使⽤用@property声明属性
//        
//        例如:@property NSString *name; 相当于@interface中声明了两个⽅方法(setter、getter):
//          - (void)setName:(NSString *)name;
//        - (NSString *)name;
        
//        属性的实现:使⽤用@synthesize实现属性
//        
//        例如:@synthesize name = _name;
//        相当于@implementation实现了setter、getter
//        - (void)setName:(NSString *)name
//        {...}
//        - (NSString *)name
//        {...}
       //在这里简单说一下_object和object的区别。_object是MyClass类的成员变量,object是属性。property和synthesize定义了一对getter和setter方法,在这里的getter方法是object,setter方法是setObject,事实上getter和setter方法操作的是变量_object。
        
       
#pragma mark----属性的属性
        
        
        
        
//第一类,读写性控制(readonly/readWrite/setter/getter/) 默认readWrite
//        readonly,告诉编译器,只声明getter⽅方法(⽆无setter⽅方法)。
//        例如:@property(readonly)NSString *name;
//        
//        //等价于 - (NSString *)name;
//        readwrite,告诉编译器,既声明setter⼜又声明getter。
//        例如: @property(readwrite)NSString *name;
//        
//        //等价于 - (NSString *)name;
//        
//        - (void)setName:(NSString *)name;
//        readwrite是读写性控制的默认设置
      
//第二类:原子性控制(nonatomic、atomic) 默认atomic
//        atomic。setter、getter⽅方法在多线程访问下是绝对安全的,即 setter、getter内部做了多线程访问处理。
    
        
        
//          原⼦子性控制的默认设置是 atomic
//        nonatomic。setter、getter⽅方法内部不会做多线程访问处理,仅仅是 普通的setter、getter⽅方法
//        程序开发过程中,setter、getter处处都在⽤用,如果使⽤用atomic,需要不断 的对setter、getter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低系统性能。 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
        
//第三类:语义设置(assign、retain、copy)
//        assign。setter、getter内部实现是直接赋值。
//
  //assign:就是简单的setter getter 方法
// retain
//        如果属性是非对象类型(比如int,float等)属性的语义设置使⽤用assign。
//        如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设置使⽤retain。
//        如果属性是对象类型并且想得到参数的copy,用copy关键字。
//
//        retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,retain,是说明该属性在赋值的时候,先release
//        之前的值,然后再赋新值给属性,引用再加1。retain是创建一个指针,引用对象计数加1
        
//内部实现        :@property(nonatomic,retain)NSString *name;
//        - (void)setName:(NSString *)name{
//            if(_name != name){
//                
//                [_name release];
//                
//                _name = [name retain];
//            }
//            
//        }
//    }
//    - (NSString *)name{
//        
//        return [[_name retain]autorelease];
//copy
        
//        copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。copy是创建一个新对象
// 内部实现:@property(nonatomic,copy)NSString *name;
//        - (void)setName:(NSString *)name{
//            if(_name != name){
//                
//                [_name release];
//                
//                _name = [name copy];
//            }
//            
//        }
//    }
//    - (NSString *)name{
//        
//        return [[_name retain]autorelease];
        
        
//        如果属性是⾮对象类型(⽐如int,float等)属性的语义设置使⽤用assign。
//       如果属性是对象类型(比如NSStrng、NSArray等)属性的语义设置使用retain。
//        如果属性是对象类型并且想得到参数的copy,使用copy关键字。
//        
        
    
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值