OC中的@property详解
简介:
@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详解的更多相关文章
- Objective-C中的@Property详解
Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- C#中的Attribute详解(下)
原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...
- angularJS中$apply()方法详解
这篇文章主要介绍了angularJS中$apply()方法详解,需要的朋友可以参考下 对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的 ...
- wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)
2010-03-24 16:19:07| 分类: WPF相关 | 标签: |字号大中小 订阅 wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2 简单 ...
- IOS中UITableViewCell使用详解
IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...
- spring在IoC容器中装配Bean详解
1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...
- Spring Boot中@ConditionalOnProperty使用详解
在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能. Spring Boot中的使用 在Spring Boot的源 ...
随机推荐
- QuickFlow UI 控件之 NamedFormAttachment
在开发自定义表单时,如果碰到需要按类别上传附件的情况,(比如流程附件分为草稿版,正式版,发布版),比较难处理,需要开发自定义字段控件来实现. QF最新版本(Build131124)提供了NamedFo ...
- 详细解读DialogFragment
原博客地址:http://www.cnblogs.com/tianzhijiexian/p/4161811.html 相信看这篇文章的人都应该知道android中的Dialog了吧,如果对于Dialo ...
- 学习linux之用mail命令发邮件
背景 这两天工作比较闲,网上各种冲浪(这个词暴露我的网龄了).看到一位大神的文章更闲 <>.端详一番,原来是用R语言拼接字符串后用shell命令发出去.发现shell命令既然还能直接发邮件 ...
- iframe大小自适应
前几天,舍友去某互联网公司面前端研发工程师.回来后,他就跟我们聊了下面试官给他出的题.其中,有一道题是“如何实现iframe高度的自适应?”.好吧,我承认,我听到iframe这个词的第一反应就是:这个 ...
- 漫谈C语言结构体struct、公用体union空间占用
先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...
- 【转】Hadoop命令大全
Hadoop命令大全 本节比较全面的向大家介绍一下Hadoop命令,欢迎大家一起来学习,希望通过本节的介绍大家能够掌握一些常见Hadoop命令的使用方法.下面是Hadoop命令的详细介绍. 1.列出所 ...
- SQL Server 2008 R2 升级到 Service Pack 3后Report Builder启动不了
一同事将测试服务器从SQL Server 2008 R2 SP2升级到了SQL Server 2008 R2 SP3后发现Report Service的报表编辑时启动不了Report Builder, ...
- SQL性能优化:如何定位网络性能问题
一同事跟我反馈他遇到了一个SQL性能问题,他说全表只有69条记录,客户端执行耗费了两分多钟,这不科学呀.要我分析一下原因并解决.我按照类似表结构,构造了一个案例,测试截图如下所示 这个表有13800K ...
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path解决方案
0.环境: win7系统,Tomcat9配置无误. 1.错误: 项目中某一.jps页面忽然出现错误,鼠标点上去为:The superclass "javax.servlet.http.Htt ...
- 使用 shell 脚本实现 LANMP 一键安装
使用 shell 脚本来实现 LANMP 系统的一键安装.使用的操作系统是 CentOS 6 ,不区分 32 位和 64 位,要求机器可以连通互联网.支持 LAMP 和 LNMP ,MySQL 支持 ...