@property和@protocol小记

众所周知,@property是Objective-C语言的关键字,在xcode4.5之前的版本需要与@synthesize配对使用,之后则可以单独使用。作用是通过合成存取方法来封装对象中的数据,通常被称为属性。因此,@property 的本质就是ivar(实例变量) 和 getter/setter(存取方法)。编译器是根据Objective-C严格的命名规范来生成存取方法的,因此实例变量前面会加下划线(_),gettter方法就是属性名,setter方法就是在属性名前面加set。

下面并不打算讨论@property的细节问题,而是着重说明一下@property在遇到@protocol时的一些小的变化。对于@protocol,在iOS开发中见得最多的应该是把它用于代理,例如:

UITableView的代理
UITableViewDelegate,UITableViewdataSource,
UIScrollView的代理
UIScrollViewDelegate等等。

而@protocol最重要的还应该用于作为接口(或者叫抽象基类)。由于Objective-C语言不存在多重继承一说,因此抽象基类很少这样叫。常被提及的应该是面向协议编程。

关于@protocol的简单使用:


// Parent.h
@protocol Parent <NSObject>
- (void)setName:(NSString *)name;
- (NSString *)name;
@end

// Child.h
@interface Child : NSObject<Parent>{
    NSString *name_;
}

- (void)setName:(NSString *)name;
- (NSString *)name;

@end

// Child.m
@implementation Child

- (void)setName:(NSString *)name {
    name_ = name;
}

- (NSString *)name {
    return name_;
}
@end

以上示例,定义协议Parent,Child遵从这个协议就必须由自己去实现,这是理所应当的事情。如果不去实现:

警告信息:Method 'setName:' in protocol 'Parent' not implemented
Method 'name:' in protocol 'Parent' not implemented

意思是:Parent协议中的方法setName和name没有实现

假如

协议Parent中使用@property呢?协议中明确说明不能声明成员变量,@property并不是,应该说并不仅仅是。代码如下:

// Parent.h
@protocol Parent <NSObject>
@property (copy, nonatomic) NSString *name;
@end

// Child.h
@interface Child : NSObject<Parent>
// 假如这里面什么也不写 
//@property (copy, nonatomic) NSString *name;

// 假如这里面这样写是否正确?
- (void)setName:(NSString *)name;
- (NSString *)name;

@end

// Child.m
@implementation Child

@end

答案是:两种写法都可以,不过什么也不写编译器一定会发出警告,这是毋庸置疑的。只是,警告与上面有所不同。

警告信息:Auto property synthesis will not synthesize property 'name' declared in protocol 'Parent'
意思是:Parent协议中的属性name不会被自动合成,也就是不会自动合成存取方法和实例变量。

再次假如

协议Parent中使用setName和name,Child遵从Parent协议,但是使用@property来合成setName和name方法,同样可行。

因此,结论是@property是可以在@protocol中使用的,只是由于@protocol特性的限制,@property在@protocol中并不会合成实例变量,只会合成存取方法。因此在@protocol中使用了@property,对应的在遵从此协议的类中,如果不需要重写setter和getter的情况写也使用@property交给编译器自动合成。

注意:@property合成的实例变量只有自己可以直接访问,也就是(_XX = ?),如果还有子类继承Child,则只能通过点语法访问,或者直接调用setter和getter方法访问。

最后针对Objective-C协议补充说明

1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现

2)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明

3)只要父类遵守了某个协议,那么子类也遵守

4)Protocol声明的方法可以让任何类去实现,protocol就是协议

5)OC不能继承多个类(多继承)但是能够遵守多个协议,继承(:),遵守协议(<>)

6)基协议:<NSObject>基协议,是最根本最基本的协议,其中声明了很多最基本的方法

7)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一个协议中的方法声明(称为协议继承)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 出题者简介: 孙源(sunnyxx),目前就职于百度,负责百度知道 iOS 客户端的开发工作,对技术喜欢刨根问底和...
    戈多_于勒阅读 1,790评论 0 5
  • 下雨天 看着旁边有个光头正对着草坪站着,下雨天的,觉得奇怪,仔细地看了好久。你说,别看了,人家在撒尿。我说我知...
    少女与野花阅读 270评论 0 0
  • 上海的季节变化很有意思 没什么规律(是不是很神秘,很因垂斯汀) 连着下了好几天大雨后 好不容易盼来的周六 变天了 ...
    张艾拉阅读 207评论 2 0