iOS Category 和 Protocol 中的 Property 你们真的会了么?

一、property

合成存取器:

@property的格式:

1 @property (修饰列表) 变量类型 变量名;

Xcode4.4之前:

@property使编译器自定生成set/get方法声明。

@synthesize自动生成set/get方法的实现

@synthesize还会自动生成私有成员变量

Xcode4.4以后:

不用再写@synthesize,编译器通过@property就能给我们生成set/get方法的声明和实现,默认生成成员变量:_propertyName

用@property生成的成员变量是私有的。

当我们想改变默认的成员变量名时,@synthesize age = newName;‘

如果子类想访问父类的成员变量,

1、通过set/get方法

2、显示的声明成员变量

**进入正题**

首先声明:

category和protocol可以添加方法

category 和 protocol中可以添加@property 关键字

二、关于protocol中的property

在protocol中添加property时,其实就是声明了 getter 和 setter 方法,在实现这个protocol协议的类中,我们要自己手动添加实例变量,并且需要实现setter/getter方法

伪代码:

main.m

1 Student *student = [[Student alloc] init];
2
3 student.name = @"彭爸爸";
4
5 NSLog(@"%@", student.name);
6         

person.h

设置协议,与其中的property

 1 //
 2 //  Person.h
 3 //  类别 和 协议
 4 //
 5 //  Created by ma c on 16/5/19.
 6 //  Copyright © 2016年 彭盛凇. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @protocol personDelegate <NSObject>
12
13 @property (nonatomic, copy) NSString *name;
14
15 @end
16
17 @interface Person : NSObject
18
19 @end

student.h

生成成员变量,_name

 1 //
 2 //  PersonSon.h
 3 //  类别 和 协议
 4 //
 5 //  Created by ma c on 16/5/19.
 6 //  Copyright © 2016年 彭盛凇. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11
12 @interface Student : NSObject <personDelegate>
13 {
14     //***声明成员变量***
15      NSString *_name;
16 }
17
18
19 @end

student.m

这里写了两种方法,一种是自动实现setter/gerter,一种为手动setter/gerter

 1 //
 2 //  PersonSon.m
 3 //  类别 和 协议
 4 //
 5 //  Created by ma c on 16/5/19.
 6 //  Copyright © 2016年 彭盛凇. All rights reserved.
 7 //
 8
 9 #import "Student.h"
10
11 @implementation Student
12
13 //------------------自动----------------------//
14 //@synthesize
15 //
16 //编译器期间,让编译器自动生成getter/setter方法。
17 //
18 //当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
19
20 //自动生成setter/getter方法
21
22 //@synthesize name;
23
24
25
26 //------------------手动----------------------//
27
28 //@dynamic
29 //
30 //告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
31 //
32 //然后由自己实现存取方法
33
34 //实现Person中定义的属性name的set方法
35 - (void)setName:(NSString *)name {
36     _name = name;
37
38 }
39
40 //实现Person中定义的属性name的get方法
41 - (NSString *)name {
42     return _name;
43 }
44
45 @end

打印Log日志为:

说明成功实现property的基本功能,并可以实现赋值与取值操作

三、category中的property

在category中添加property时, 在@implentation添加 getter 和 setter方法时, 由于category不能添加实例变量

1)使用临时全局变量来替代成员变量

首先声明:Person没有name属性

main.m

导入头文件:

#import "Person+Extension.h"

1 Person *person = [[Person alloc] init];
2
3 person.name = @"peng";
4
5 NSLog(@"%@", person.name);

Person+Extension.h

 1 //
 2 //  Person+Extension.h
 3 //  类别 和 协议
 4 //
 5 //  Created by ma c on 16/5/19.
 6 //  Copyright © 2016年 彭盛凇. All rights reserved.
 7 //
 8
 9 #import "Person.h"
10
11 @interface Person (Extension)
12
13 @property (nonatomic, strong) NSString *name;
14
15 @end

Person+Extension.m

 1 //
 2 //  Person+Extension.m
 3 //  类别 和 协议
 4 //
 5 //  Created by ma c on 16/5/19.
 6 //  Copyright © 2016年 彭盛凇. All rights reserved.
 7 //
 8
 9 #import "Person+Extension.h"
10 #import <objc/runtime.h>
11
12 //***临时变量***
13 static NSString *_name;
14
15 @implementation Person (Extension)
16
17 - (void)setName:(NSString *)name {
18     _name = name;
19 }
20
21 - (NSString *)name {
22     return _name;
23 }
24 @end

2)使用runtime 关联对象 实现成员变量

除了Person+Extension.m 其他与 第一种方法一致

runtime Person+Extension.m

 1 @implementation Person (Extension)
 2
 3 - (void)setName:(NSString *)name{
 4     objc_setAssociatedObject(self,@selector(name),name,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
 5 }
 6
 7 - (NSString *)name{
 8
 9     NSString *n = objc_getAssociatedObject(self, @selector(name));
10     return n;
11 }

两种方式打印Log日志相同,同时为:

时间: 2024-10-12 07:25:16

iOS Category 和 Protocol 中的 Property 你们真的会了么?的相关文章

objective c, category 和 protocol 中添加property

property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 所以,在protocol中添加property时,其实就是添加了 getter 和 setter 方法,在实现这个protocol的类中,我们要自己手动添加实例变量 例: @synthesize name = _name; //此行代码即添加了实例变量及实现了protocol中属性的getter.s

ios category,protocol理解

category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现因类的不同而不同的时候,需要用到protocol或interface,C++中不需要interface是因为C++支持多重继承,实现类似功能只需要各个类继承同一个基类即可) 现有的类如果要实现protocol就需要实现其中的方法,方法实现在现有的类中,现有类需要做改动.

IOS开发之——Protocol协议的使用

protocol ['pr?ut?k?l] (例子:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html ) 一.说明 两个类进行通讯,用协议就比较方便. 1.协议声明了可以被任何类实现的方法 2.协议不是类,它是定义了一个其他对象可以实现的接口 3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议. 4.协议经常用来实现委托对象.一个委托对象是一种用来协同或者代表其他对象的特殊对象. 5:委托,就是调用自己定义方法,别的类来实

ios category类别的使用

ios category类别的使用 Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category).类别用于对一个已经存在的类添加方法(Methods).你只需要知道这个类的公开接口,不需要知道类的源代码.需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables). 类别的基本语法如下: @interface ClassName(CategoryName)//method declarations@end@interface 类名(类别名

【转】Objective-C——消息、Category和Protocol

Objective-C——消息.Category和Protocol 原文: http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html [注意]protocol本身是可以继承的 面向对象永远是个可以吐槽的话题,从开始提出到推崇备至,到充满质疑,一路走来让人唏嘘不已.面向对象的思想可谓历史悠久,20世纪70年代的Smalltalk可以说是面向对象语言的经典,直到今天我们依然将这门语言视为面向对

iOS: 属性列表介绍 Introduction to Property Lists

iOS: 属性列表介绍 Introduction to Property Lists 从本质上说, 属性列表就是苹果的对象数据序列化与反序列化方式 属性列表使用几种数据类型把数据组织为键值表和值表 Property lists organize data into named values and lists of values using several object types. 这些类型使你能产生结构良好,便于传输,存储,和访问并且有效的数据.These types give you th

Objective-C中的@Property具体解释

Objective-C中的@Property具体解释 @Property (属性) class vairs 这个属性有nonatomic. strong. weak, retain. copy等等 我把它们分为三类,各自是:原子性.存取器控制,内存管理. 原子性 atomic(默认):atomic意为操作是原子的,意味着仅仅有一个线程訪问实例变量.atomic是线程安全的.至少在当前的存取器上是安全的. 它是一个默认的特性,可是非常少使用,由于比較影响效率,这跟ARM平台和内部锁机制有关. no

Category在项目中的实际运用

先看两行代码:1. label2.textColor = [UIColor colorWithHexString:@"707070"]; 2. _table.header = [MJRefreshHeader headerWithRefreshingBlock:^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ /

Objective-C中的property

property可以被声明的位置 property可以在类的interface section和class extension以及protocol中被声明 property的可见性 Objective-C中的property实际上就是getter和setter方法.一个类的property能够在外部被访问,主要看该类的property声明在外部能否可见.比如有一个类X,其.h和.m文件如下: //X.h #import <Foundation/Foundation.h> @interface