属性,初始化,类别,协议
属性的实现
成员变量只能在类内部使用,属性是可以被外界访问的。
1.属性的声明
#import <Foundation/Foundation.h>@interface QYPerson : NSObject{NSString *_name; }//@property是编译指令,帮助直接生成setter和getter方法,以及成员变量 @property (readonly, nonatomic) NSString *identify; @property (nonatomic) NSString *name; @property (nonatomic) int age; @property (nonatomic, getter=isMan) BOOL sex; // getter=isMan用来更改getter方法的名字,特别对于布尔值的一些属性这样改名字会有利用getter方法语义的理解,尽量不要该setter方法的名字// @property (nonatomic)int age; // 中间的(nonatomic)是属性扩展,分为三类 // 内存相关的:strong assign copy weak retain // 读写相关的:readonly readwrite(默认值) // 性能相关的:nonaotmic aotmic@end
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法
@synthesize name = nickName;
@synthesize 在4.2之前版本需要配合生成成员变量名字使用及生成setter getter方法,在4.2之后只是用来给成员变量起别名
2 属性的扩展
a 读写 默认的是readwrite
b 只读 readonly
c 内存管理(默认assign,相当于之前的__unsafe_unretained)
d assign/weak弱引用/strong(retain)(强引用)/copy
对于copy限定的自定义类,是指需要在给该属性赋值的时候用copy来完成,但是这取决于程序员的逻辑
e 原子性(默认nonatomic,可以提高程序性能) nonatmic/aotmic
@private 修饰的成员变量只有本类可见
@protected 修饰的成员变量只有本类和子类中可见
@public修饰成员变量在所有地方都可见
3 初始化
用new新建对象的时候,默认调用的是alloc分配内存,然后再调用init方法初始化
便利初始化:指的是在初始化的时候可以很方便的进行赋值
指定初始化:在编写便利初始化的时候,通过self调用其他属性已编辑好的便利初始化方法并附上初始化的值,即指定初始化值的初始化方法
编写初始化方法的时候一定要记得[super init],用来初始化自超类继承过来的属性变量
类别 Category
类别与继承的区别
类别是对类本身方法方法的扩展
继承是建立一个新的类用来扩展新的属性和方法
类别的优点
将类的实现代码分散到多个不同文件或框架中
拆分头文件
添加非正式协议,非正式协议是指对NSObject的扩展出的类别,所有对象都可以使用非正式协议中声明实现的方法,声明如下
#import <Foundation/Foundation.h>@interface NSObject (BlackRule)- (void)laugh;@end
实现如下
#import "NSObject+BlackRule.h"@implementation NSObject (BlackRule)- (void)laugh {NSLog(@"?,你被潜规则了"); }@end
类别的优先级最高,会掩盖掉原来类中的同名方法,会有警告
类别的声明
使用公共的头文件(可以把类别的声明全部放入发到类的借口文件)
#import <Foundation/Foundation.h>@interface TestClass : NSObject@property (nonatomic, strong) NSString *name;- (void)doTthing;@end// 利用类别来拆分类的实现 @interface TestClass (TestCategory1)- (void)doTthing1;@end@interface TestClass (TestCategory2)- (void)doTthing2;@end@interface TestClass (TestCategory3)- (void)doTthing3;@end
使用分离的头文件(可以按类名+类别名的文件命名方式来单独存放类别的声明),新建category文件来声明实现类别
响应选择器 @selector
@selector (方法名)
SEL 可以理解为方法的类型
SEL method = @select(方法名),可以用method作为变量,当做参数使用
//@selector(destoriedLife)代表SEL method = @selector(destoriedLife);BOOL result = [ps respondsToSelector:method];if ([ps respondsToSelector:method]) {NSLog(@"执行destoriedLife");} else {NSLog(@"不能执行destoriedLife");}
- (BOOL)respondsToSelector:(SEL)aSelector;用来检测对象是否能响应某个方法
协议 @protocol
协议是建立在两方之上,使用协议之后,必须承诺实现协议声明的所有方法。协议本事是一个有文件,过多的导入头文件会引起编译问题,需要注意协议的使用时机
#import <Foundation/Foundation.h>@protocol SecretProtocol <NSObject>+ (void)foo;- (void)phoneCall; - (void)teakTea;@optional //@optional用来修饰协议里面的方法是否可选 - (void)goShopping;@required //@optional用来修饰协议里面的方法是必须实现的 - (void)meetting; - (void)takeDinner;@end
使用协议
#import <Foundation/Foundation.h> #import "SecretProtocol.h"@interface Secrectary : NSObject <SecretProtocol>@end
NSCopying协议
copy:默认调用copyWithZone,copyWithZone:才是NSCopying协议中规定必须实现的
转载于:https://www.cnblogs.com/k-on/p/4695465.html
属性,初始化,类别,协议相关推荐
- 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
文章目录 I . 属性 字段 总结 II . 属性声明 III . 属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延 ...
- 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )
文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...
- Python 中类的继承:属性初始化、类型判断、多态、多继承和对象信息的获取
属性初始化: 一定要用super(Teacher, self).__init__(name, gender)去初始化父类,否则,继承自 Person 的 Teacher 将没有 name 和 gend ...
- Angular Component class属性初始化和构造函数执行的先后顺序
如图,该Component类第13行属性初始化逻辑,以及第17行构造函数里的断点,到底哪一行代码先执行? 在调试器里观察: 首先执行custom Component factory函数,创建Compo ...
- 关于Java静态属性初始化
Java中静态属性初始化的方式有两种: 1.定义时初始化 2.静态代码块中初始化 当两种方式出现在同一个代码中,执行顺序就是代码中出现的先后顺序: public class Main {static ...
- Linux无法初始化sftp协议,winscp:无法初始化SFTP协议。主机是SFTP服务器吗?
今天装了个CentOS 6.0的虚拟机,不知道是否因为选了"basic server"安装的原因 putty能够正常访问,但是用winscp连接是时候却出现了如下错误 " ...
- 无法初始化SFTP协议。主机是SFTP服务器吗
winscp 报错:"无法初始化SFTP协议.主机是SFTP服务器吗?" 解决办法: 将Session界面的File protocol:设为SCP即可 (默认为SFTP) 本文转自 ...
- winscp:无法初始化SFTP协议。主机是SFTP服务器吗?
今天装了个CentOS 6.0的虚拟机,不知道是否因为选了"basic server"安装的原因 putty能够正常访问,但是用winscp连接是时候却出现了如下错误 " ...
- 无法初始化sftp协议。主机是sftp服务器吗?_WinSCP v5.15.3 免费的 开源图形化 SFTP 客户端...
WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端.同时支持 SCP 协议.它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件. 主要功能 ...
- Visual Studio 2015 前瞻 属性初始化赋值!
通常我们建立属性的时候如果带初始化值的时候我们经常会这样处理. class MyClass{private string _name = "hello world!";public ...
最新文章
- 服务器与浏览器数据传输过程中编码问题
- 求数组中第k个最小数
- c语言考试题及答案 大一,大一C语言期末考试试题
- 安全手册(初稿)[转]
- android+5.q,MSM8909+Android5.1.1电池管理(2)--qpnp-linear-charger.txt驱动学习概要
- 查看回调函数执行在那个线程中的方法
- python历史 用量 预测_用python做时间序列预测七:时间序列复杂度量化
- boot客户管理系统源码_「计算机毕设」基于SpringBoot开发的仓库管理系统
- Qt QLabel文本框的使用
- 像素越多越好?像元的面积越小越好?为何底大一级压死人?
- Python OS模块操作文件目录
- jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
- 考研政治——马克思辩证法中的两大特征和五大范畴
- RankNet学习思路+损函感悟+\pi \xu 学xi+交叉熵损函详
- matlab 蠓虫,蠓虫分类.doc.doc
- COSCon'22@Beijing | 北京分会场等你赴约
- torchtorchvision对应版本
- go ip过滤_智慧识别“GOIP”呼转 罪犯无所遁形
- 微信小程序中如何引用weUI(踩坑记录)
- Python 办公小助手:读取 PDF 中表格并重命名