文档章节

在类别中声明属性

TonyGo
 TonyGo
发布于 2015/08/17 14:27
字数 256
阅读 328
收藏 0

除了扩展之外,其他类别都无法向类中新增实例变量,所以,编译器无法把实现属性所需的实例变量合成出来。

从概念上讲,属性是封装数据的方式。类别是扩展类功能的手段,而非封装数据。因此,一般情况下应该避免把属性声明在类别中,而应该声明在“主接口”中。

如果不得不这么做的话,可以使用关联对象辅助实现:

//
//  NimoPerson+Friendship.h
//  PersonDemo
//
//  Created by Tony on 15/8/17.
//  Copyright (c) 2015年 NimoWorks. All rights reserved.
//

#import "NimoPerson.h"

@interface NimoPerson (Friendship)

@property (nonatomic, strong) NSArray *friendsArray;

@end

//
//  NimoPerson+Friendship.m
//  PersonDemo
//
//  Created by Tony on 15/8/17.
//  Copyright (c) 2015年 NimoWorks. All rights reserved.
//

#import "NimoPerson+Friendship.h"
#import <objc/runtime.h>

static const char *kFriendsPropertyKey = "kFriendsPropertyKey";

@implementation NimoPerson (Friendship)

- (NSArray *)friendsArray {
    return objc_getAssociatedObject(self, kFriendsPropertyKey);
}

- (void)setFriendsArray:(NSArray *)friendsArray
{
    objc_setAssociatedObject(self, kFriendsPropertyKey, friendsArray, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

需要特别留意的是设置方法中的内存管理语义:

关联类型 等效的@property属性

OBJC_ASSOCIATION_ASSIGN

assign

OBJC_ASSOCIATION_RETAIN_NONATOMIC

nonatomic, retain

OBJC_ASSOCIATION_COPY_NONATOMIC

nonatomic, copy

OBJC_ASSOCIATION_RETAIN

retain

OBJC_ASSOCIATION_COPY

copy


© 著作权归作者所有

TonyGo
粉丝 0
博文 8
码字总数 4772
作品 0
徐汇
程序员
私信 提问
iOS成员属性和成员变量的区别

一、@property 和@synthesizer 在objective-c 1.0中,我们为interface同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 在o...

朝雨晚风
2016/08/12
0
0
Objective-C 关联对象

当创建你的应用时,你可能创建类别(category)来扩展内核的类如 NSString, NSMutableArray 等。类别(Categories)模仿其它语言(.Net)中的扩展。 一个关键的事实是,它是不能够包括属性或类别内...

oschina
2013/05/25
795
0
OC中类目(Catagory)和扩展(Extension)的使用

一 . Objective-C中的类别(Category)主要有两大功能,一个是将类的相关方法进行分组,另一个是无需继承即可向现有的类添加新的方法以扩展其功能。 例如,您所在的开发团队需要创建一个类,...

水一样的人儿
2016/04/29
266
0
MFC edit control 用法

1.用SetWindowText设置文本内容并换行: 其中控件属性设置: MultiLine=true; want Return = true; strMsg+=s+"/r/n";// 用/r/n换行。 //获得EDIT CEdit* pBoxOne; pBoxOne = (CEdit*) GetDl......

程序鸡
2012/11/02
788
0
iOS:属性、修饰词(内存管理) 及其对应成员变量 、ARC

------------早期GCC版本------------ --@property A作用就是让编译器在h文件声明A 的setter/getter方法; --@synthesize A作用就是让编译器在m文件生成A 的setter/getter方法;(如果自己实现...

北方人在上海
2016/01/11
64
0

没有更多内容

加载失败,请刷新页面

加载更多

友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
4
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0
分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
6
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部