关于@property的一些小总结

#关于@property的一些小总结

1、大家都知道,@property在之前版本中,只是成员变量set方法和get方法的声明,之前老版本需要在.m文件中加上@synthesize才会有成员变量的方法实现,也就是,设置器(set方法)和访问器(get方法),但现在这个版本只要用@property修饰就可以同时生成方法声明和实现的语句,同时生成一个加下划线的属性名。

在这里要注意一个问题:
当你用@property声明一个属性时,在.m文件中就会有此属性的两个方法实现,此时编辑器默认的生成属性名为带下划线的。现在如果想要自定义set方法和get方法,当你单独实现set方法时,没有问题,但是你还想自定义一个get方法时,就会报错,下面例子:

//Student的声明文件
# import < Foundation/Foundation.h>

@interface Student : NSObject
@property (nonatomic,strong) NSString * name;//声明和实现了name的set方法和get方法,生成一个带下划线的属性名
@end

//Student的实现文件.m

  # import"Student.h"

@implementation Student
- (void)setName:(NSString *)name//此时单独自定义一个set方法时,程序不会出现任何问题
{

_name = name;

}
//注意一下当下面自定义一个get方法时会出现错误

  • (NSString *)name
    {
    return _name;
    }

@end
其实问题出现就是同时自定义实现了set方法和get方法,这时Xcode不会自动生成@synthesize,也就不会自动生成带下划线_name,所以我们要解决这个问题有3种做法,一个是直接删掉自定义get方法,因为get方法我们一般用默认的就行了,另一个做法就是在前面合成一下即加上 @synthesize name = _name; 或者在.h文件中@interface下定义一个下划线的属性,问题即可解决。

2、关于@property后面内括号关键字的一点小结

原子,非原子 (atomic,nonatomic)百度一下你就知道
说一下retain和copy是做了些什么

(1)retain:内存管理中,setter方法release旧值(计数器-1),再retain新值(计数器+1)
(2)copy:内存管理中,setter方法release旧值(计数器-1),再copy新值(计数器+1)
代码如下:
- (void)setName:(NSString *)name
{
if(_book != book)
{
//先释放旧的成员变量
[_book release];
//再retain新传进来的对象
_book = [book retain];
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰器(decorator)是一种可以给函数或类动态添加功能的工具。在Python中,有一些内置的装饰器,比如@staticmethod、@classmethod和@property。 @staticmethod装饰器用于定义静态方法。静态方法是一个和类没有绑定关系的方法,可以直接通过类名调用,也可以通过实例调用。使用@staticmethod装饰器可以将一个方法转变为静态方法。 @classmethod装饰器用于定义类方法。类方法是与类相关联的方法,通过类名调用时,会将类本身作为第一个参数传入。使用@classmethod装饰器可以将一个方法转变为类方法。 @property装饰器用于定义属性。属性是一种特殊的方法,可以像访问属性一样来访问方法。使用@property装饰器可以将一个方法转变为属性。通常,一个@property装饰器会配合一个相应的.setter装饰器使用,来定义属性的设置方法。 举个例子,对于一个名为Student的类: class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value 这个类中的score方法被@property装饰器修饰,使得它可以像属性一样被访问。同时,@score.setter装饰器定义了一个setter方法,用于设置score属性的值。这样,我们可以通过实例的score属性来获取和设置学生的成绩。 总结起来,@staticmethod、@classmethod和@property是Python内置的装饰器,分别用于定义静态方法、类方法和属性。它们可以让我们的代码更加简洁和易读。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python面试常问的几个内置装饰器:@staticmethod、@classmethod和@property](https://blog.csdn.net/weixin_35383324/article/details/113674252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python 使用@property对属性进行数据规范性校验](https://blog.csdn.net/a772304419/article/details/120813610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值