Objective-c - @property的参数
来源:互联网 发布:cf自动准备源码 编辑:程序博客网 时间:2024/04/28 03:52
/*
Objective-c - @property的参数
1> 回顾@property的功能:
1,自动生成私有的带下划线的属性;
2,自动的生成这个属性的setter/getter方法的声明;
3,自动的生成这个属性的setter/getter方法的实现;
setter的实现,直接赋值;getter的实现,直接返回.
注意: 生成的是不含内存管理代码的setter方法.
2> @property的参数:@property可以带参数,带不同的参数可以实现不同的功能.
语法:@property(参数1,参数2,...)数据类型数据名称;
1,与多线程相关的参数
atomic :默认值.生成的setter/getter方法是很安全的方法,安全但是性能低下.
nonatomic:生成的setter/getter方法不安全,但是效率高.
(注意:推荐使用nonatomic,不写的话默认是atomic).
2,与生成setter方法实现相关的参数
assign:默认值.如果使用assign,生成的setter方法的实现中,就是直接将参数的值赋值给属性.
retain:生成的setter方法中,是标准的MRC内存管理代码.如下:(以YYCar *_car为例)
- (void)setCar:(YYCar *)car
{
if(_car != car)
{
[_car release];
_car = [car retain];
}
}
(当属性的类型是oc对象的时候,就使用retain.当属性的类型是非oc对象的时候,就使用assign).
(但是并不会在dealloc中也生成release代码,所以dealloc中的release需要自己去写).
3,与生成只读,读写封装相关的参数
readwrite:默认值.同时生成setter/getter方法.
readonly:值生成getter方法,不生成setter.
4,与指定生成的setter/getter方法的名称相关的参数
setter:可以指定生成的setter方法的名称;
语法:setter = abc,即生成的setter方法的名称是abc,即: - (void)abc:(YYCar *)car;
getter:可以指定生成的getter方法的名称;
语法:getter = abc,即生成的getter方法的名称是abc,即: - (YYCar *)abc;
只有当属性的类型是BOOL类型的时候,我们可以修改getter方法的名称,以提高代码的阅读性:
例:@property(getter = isGoodMan) BOOL goodMan;
例:YYPerson *xiaoming = [YYPerson new];
xiaoming.goodMan = YES;
NSLog(@"%d", xiaoming.isGoodMan):
注意:参数的顺序没有要求,同一组参数不可以同时使用.
*/
#import <Foundation/Foundation.h>
#pragma mark -
#pragma mark 车类的创建
//声明
@interface YYCar : NSObject
@property(nonatomic,retain)NSString *brand;
@property(nonatomic,assign)int speed;
- (void)run;
//自定义构造方法
- (instancetype)initWithBrand:(NSString *)brand;
- (instancetype)initWithBrand:(NSString *)brand andSpeed:(int)speed;
+ (instancetype)carWithBrand:(NSString *)brand;
+ (instancetype)carWithBrand:(NSString *)brand andSpeed:(int)speed;
@end
//实现
@implementation YYCar
//重写dealloc方法,监视车对象的回收
- (void)dealloc
{
NSLog(@"%@释放了!",_brand);
[super dealloc];
}
- (void)run
{
NSLog(@"%@在行驶!",_brand);
}
//自定义构造方法
- (instancetype)initWithBrand:(NSString *)brand
{
if(self = [superinit])
{
self.brand = brand;
}
return self;
}
- (instancetype)initWithBrand:(NSString *)brand andSpeed:(int)speed
{
if(self = [superinit])
{
self.brand = brand;
self.speed = speed;
}
return self;
}
+ (instancetype)carWithBrand:(NSString *)brand
{
return [[selfalloc]initWithBrand:brand];
}
+ (instancetype)carWithBrand:(NSString *)brand andSpeed:(int)speed
{
return [[selfalloc]initWithBrand:brandandSpeed:speed];
}
@end
#pragma mark -
#pragma mark 人类的创建
//声明
@interface YYPerson : NSObject
@property(nonatomic,retain)NSString *name;
@property(nonatomic,retain)YYCar *car;
@property(nonatomic,assign,getter=isGoodMan)BOOL goodMan;
- (void)drive;
//自定义构造方法
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car;
- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan;
+ (instancetype)personWithName:(NSString *)name;
+ (instancetype)personWithName:(NSString *)name andCar:(YYCar *)car;
+ (instancetype)persontWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan;
@end
//实现
@implementation YYPerson
//重写dealloc方法,监视人对象的回收
- (void)dealloc
{
NSLog(@"%@释放了",_name);
[_car release];
[super dealloc];
}
- (void)drive
{
NSLog(@"%@开去上学",_name);
[_car run];
}
//自定义构造方法
- (instancetype)initWithName:(NSString *)name
{
if(self = [superinit])
{
self.name = name;
}
return self;
}
- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car
{
if(self = [superinit])
{
self.name = name;
self.car = car;
}
return self;
}
- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan
{
if(self = [superinit])
{
self.name = name;
self.car = car;
self.goodMan = goodMan;
}
return self;
}
+ (instancetype)personWithName:(NSString *)name
{
return [[selfalloc]initWithName:name];
}
+ (instancetype)personWithName:(NSString *)name andCar:(YYCar *)car
{
return [[selfalloc]initWithName:nameandCar:car];
}
+ (instancetype)persontWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan
{
return [[selfalloc]initWithName:nameandCar:car andDoodMan:goodMan];
}
@end
#pragma mark -
#pragma mark main函数
int main(int argc,const char * argv[]) {
//创建人对象
YYPerson *xiaoming = [YYPersonpersonWithName:@"小明"];
xiaoming.goodMan = YES;
NSLog(@"%@%@", xiaoming.name, xiaoming.goodMan ==YES?@"是一个好人":@"不是一个好人");
//创建车对象
YYCar *bz = [YYCarcarWithBrand:@"奔驰"andSpeed:120];
//将车对象赋值给人的车属性
xiaoming.car = bz;
[xiaoming drive];
[bz release];
[xiaoming release];
return 0;
}
- Objective-c - @property的参数
- Objective C @property 参数
- Objective-C - @property参数
- Objective-C 【@property 的参数问题】
- Objective-C - @property的参数总结
- Objective-c中@property声明时的参数释疑01
- Objective-c中@property声明时的参数释疑02
- Objective-c中@property声明时的参数释疑
- 【Objective-C】类的属性、@property参数、前向声明
- objective-c中@property的参数分别有何作用?
- Objective-c - @property的参数strong与weak
- Objective-C学习笔记(2)----Objective-c中@property声明时的参数释疑
- Objective-C学习笔记 @property 参数说明
- 【Objective-C学习-5】@property参数详解
- Objective-c的@property 详解
- Objective-C 的property学习
- Objective-c的@property 详解
- Objective-c的@property 详解
- HTML5页面开发的基础性模板
- 328. Odd Even Linked List
- 重构自己
- 1078. Hashing
- 计划任务:不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接。中断与此服务器或共享资源的连接,然后在试一次
- Objective-c - @property的参数
- 警告 1 warning C4018: “<”: 有符号/无符号不匹配
- 解决Android布局周围出现半透明阴影的问题
- 利用互斥对象实现线程同步的实例说明
- 微信小程序学习具备
- Centos系统下Lamp环境的快速搭建(超详细)
- 模板类开发问题
- Java内部类
- Django 官方文档write your first Django app --1