黑马程序员——OC基础@property语法详解

本文介绍了Objective-C中的@property关键字,包括其语法格式、setter/getter、读写属性和atomicity的用法。重点讨论了assign、retain、copy属性的区别,以及它们在不同情况下的适用性。同时,展示了@synthesize如何自动生成对应的setter和getter方法的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1、简介: 

property是Objective-C的关键词,与@synthesize配对使用,用来让编译好器自动生成与数据成员同名的方法声明。@synthesize则是用来生成对应声明方法的实现。

1.1 property的语法格式:

@property (参数1,参数2类型名字;

这里的参数,主要有以下三种:

setter/getter方法(assign/retain/copy)

读写属性(readwrite/readonly)

atomicity(nonatomic)

1.2 三种方式的使用

assign/retain/copy  代表赋值的方式。

readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

atomicity的默认值是atomic,读取函数为原子操作。

1.2.1 copy/reain/assign 在其中选择一个来确定属性的setter如何处理这个属性。NSObject对象采用这个中方式。

1.2.2 一些特别的Object比如NSSstring使用copy

1.2.3 assign关键字代表setter直接赋值,而不是复制或者保留它。适用于基本数据类型,比如NSIntegerCGFloat,或者你并不直接拥有的类型,比如delegates

2、@property和@synthesize关键字 生成的代码

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    NSObject *obj;
}
//@property (nonatomic,retain) NSObject *obj;//自己实现getter 和setter也可以替代这些关键字。//把这两个关键字对应的代码注释掉
-(NSObject*)obj;
-(void)setObj:(NSObject*)newObj;
@end

@implementation ViewController
//@synthesize obj;
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.obj = nil;
}

-(NSObject*)obj{
    return obj;
}
-(void)setObj:(NSObject*)newObj{
    if(obj != newObj){
        [obj release];
        obj = [newObj retain];
    }
}

再运行,也能正常启动。说明自己写的getter 和setter替代了property。
在IOS5之后,加入了Automatic Reference Counting (ARC),iOS5中新加了关键字有strongweak, unsafe_unretain

补充

assign retain copy的setter方法的内部实现

assign:

@property float price;

内部实现:

- (void)setPrice:(float)price 

 {

       _price = price;

}


getter是:

- (float)price

{

    return _price; 

} 


 

retain:

@property (retain, readwrite, nonatomic) NSString *company;

内部实现:

- (void)setCompany:(NSString *)company{

      if(_company != company){

        [_company release];

        [company retain];

        _company = company; 

     } 

}


copy:

@property (copy, readwrite, nonatomic) NSString *company;

内部实现:

- (void) setCompany:(NSString *)company{

      if(_company != company){

           [_company release];

           [company copy];

           _company = company; 

      } 

} 


只要有setter(或getter)就可以使用点语法 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值