简介:

@property 生成了变量的get set 方法,同时指定了变量名称。

例如@property (nonatomic,strong) NSString *name;表示生成了_name私有变量,同时生成了- (void)setName:(NSString*)aName 和 -(NSString*)name 两个方法。

以上就是最简单的用法,但是为了深入了解@property,以下从细节方面了解@property到底做了什么。

类名为Person

(1)@property 只是声明get set方法,@synthesize 才是定义get set方法,@synthesize 才是定义变量_name(当然也可以定义其他名字)

早期的OC的@property的写法如下:

Person.h中

@property (nonatomic,strong) NSString *name;

Person.m中

@synthesize name = _privateName;//名字任意指定,如果不写此行,则默变量名_name
/*此时@synthesize 这一行等效于
- (NSString *)name{
return _privateName;
}
- (void)setName:(NSString *)aName{
_privateName = aName;
}
*/

现在oc语言中,连@synthesize都可以省略,默认情况就是在生成的变量只是在方法器前面加上一个下划线。

(2)@property中的readonly关键字仅仅是不声明set方法吗,那么set方法在@implementaion中到底有没有实现呢?

通过例子验证,

Person.h中

@property (nonatomic,strong,readonly) NSString *name;

Person.m中

@synthesize name = _privateName;

main函数中

Person *p = [[Person alloc]init];
BOOL b1 = [p respondsToSelector:@selector(name)];
BOOL b2 = [p respondsToSelector:@selector(setName:)];
NSLog(@"b1 = %d;b2 = %d",b1,b2);//输出b1 = 1;b2 = 0

 所以证明,readonly不仅仅是拒绝声明,同时拒绝定义。

(3)在protocol中定义@property属性的后果。

既然property只是声明,所以在protocol中用@property就打不到一般的预期效果了,编译器会提示一个warning:auto property synthesis will not synthesize property 'XXX' declared in protocol 'XXXX'。也就是说,编译器本来想帮你生成@synthesize的(为什么编译器必须帮你生成呢,因为有@property,就允许调用者使用get 和set方法啊),但是发现@Property居然在协议中,所以编译器也蒙了。 此时必须手动实现get set方法,必须手动添加对应的变量。

personprotocol.h

@protocol PersonProtocol <NSObject>
@property (nonatomic,strong) NSString *name;
@end

person.h

@interface Person : NSObject<PersonProtocol>
@end

person.m

@implementation Person
{
NSString *_privateName;
}
- (NSString *)name
{
return _privateName;
}
- (void)setName:(NSString *)aName
{
_privateName = aName;
}

  此处有个小注意点:成员变量可以定义在@implementation中,虽然一般人习惯定义在extension中。

(3)小tip:@synthesize 的写法

一般情况下期写法为@synthesize name = _name;表示name是存取起名称,_name是具体的私有变量

特殊写法为@synthesize name;//其等效于@synthesize name = name;即世纪私有变量名就是name

OC中的@property详解的更多相关文章

  1. Objective-C中的@Property详解

    Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...

  2. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  3. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  4. C#中的Attribute详解(下)

    原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...

  5. angularJS中$apply()方法详解

    这篇文章主要介绍了angularJS中$apply()方法详解,需要的朋友可以参考下   对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的 ...

  6. wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)

    2010-03-24 16:19:07|  分类: WPF相关 |  标签: |字号大中小 订阅     wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2  简单 ...

  7. IOS中UITableViewCell使用详解

    IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...

  8. spring在IoC容器中装配Bean详解

    1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...

  9. Spring Boot中@ConditionalOnProperty使用详解

    在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能. Spring Boot中的使用 在Spring Boot的源 ...

随机推荐

  1. 支付宝alipay使用小结 调用支付宝程序被杀死说明

    一. 准备阶段 如果没有蚂蚁金服开放平台的注册账号,则需要实现注册一个,这里多说一点,就是当我们以公司名义注册账号时,需要预备公司的营业执照等物品(需要上传照片等信息审核).账号申请成功之后,我们需要 ...

  2. SQL Server 2008 标准版不支持Reporting Services的数据驱动订阅

    今天开发同事找我,说为什么Reporting Services服务器的报表管理的订阅选项里面只有"新建订阅"选项, 没有"数据驱动订阅"选项,说实话,我也基本上 ...

  3. MySQL优化实例

    这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...

  4. nodejs中stream相关资料

    nodejs中流(stream)的理解 nodejs stream 手册完整中文版本 nodejs stream详细使用介绍

  5. awk-笔记

    语法形式: awk [options] 'script' var=value file1 [file...] awk [options] -f scriptfile var=value file [f ...

  6. C++中的也能使用正则表达式

    正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同 ...

  7. 遍历List集合,删除符合条件的元素

    List集合的遍历有三种方式:增强for循环,普通for循环,Iterator迭代器遍历 如果只是对集合进行遍历,以上三种循环都可正常遍历: (1)增强For循环遍历List集合 List<St ...

  8. runv nslistener源码分析

    nslistener的作用实质上就是将新的namespace里的veth网卡的配置信息通过proxy进程传输出来,并且利用该信息对tap进行相同的配置,最终用tap模拟新的namespace里的vet ...

  9. jdbc java数据库连接 1)jdbc入门

      之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 什么是jdbc? 使用jav ...

  10. 使用python实现appium的屏幕滑动

    前些日子写一个滑动手机页面的小脚本,看到大家给的内容都是swipe方法,这里对swipe方法做一个小介绍: Swipe(int start x,int start y,int end x,int y, ...