iOS 学习笔记——0004(@property详解)

这里以一个Person类进行举例:

@interface Person : NSObject

{

...

}

@property(nonatomic,copy)NSString* name;

@end

@property 做了三件事

1.大括号中(如上图的大括号),声明变量,变量前加_,这里是_name

2.生成对应的get方法

3.生成对应的set方法

可以在实现文件中,重写get,set方法

这里需要注意:如果get,set方法都是自己写的话,那么在大括号中的变量声明也需要自己写了


写到这里就不得不提一下.语法

.语法的前提是 需要有一套 get set 方法

这个Circle类虽然没有length属性,但是在实例化出来的对象中是可以用.来访问的

eg:

#import <Foundation/Foundation.h>
#define PI 3.14159
@interface Circle : NSObject
@property(nonatomic)float r;

-(float)length;
-(void)setLength:(float)length;
@end

#import "Circle.h"
@implementation Circle
-(float)length
{
    return self.r * 2 * PI;
}
-(void)setLength:(float)length
{
    self.r = length / (2 * PI);
}
@end

ps:在构造函数中,尽量不要使用属性,应该直接去操作变量

如:

-(instancetype)init
{
    if (self  = [super init])
    {
        self.name = @"aaa";
        _sid = 10000;     //这个带下划线的变量仅仅是本类的变量,父类的变量是访问不到的,若要访问父类的变量,要向上一行那样
    }
    return self;
}

几个关键字的区别:

1.可读性:readonly 、readwrite(默认)

@property(readwrite,....) valueType value;这个属性是变量的默认属性,通过加入readwrite属性你的变量就会有get方法,和set方法。

@property(readonly,...) valueType value;这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的get方法。

2.assign(默认)

setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题

应用场合:对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等),不存在所有权关系的对象,比如常见的delegate。

3.retain

setter方法对参数进行release旧值再retain新值

与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,内存被释放,如下代码所示:

-(void)setName:(NSString*)_name{
     //首先判断是否与旧对象一致,如果不一致进行赋值。
     //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。
     if ( name != _name){
          [name release];
          name = [_name retain];
     }
}

4.copy

与strong类似,但区别在于copy是两块内存,而strong是传了对象的指针,操作的是一块内存

应用场合:NSString,NSArray,都要用copy修饰

(这里举个例子来说明:如果将NSMutableString传给NSString,操作同一块内存的话,NSMutableString改变会影响NSString,是有风险的)

5.strong与weak

是由ARC新引入的对象变量属性,ARC引入了新的对象的新生命周期限定

简单讲strong等同retain
weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻

6.atomic(默认)与nonatomic

atomic:atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率。nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

时间: 2025-01-31 09:27:06

iOS 学习笔记——0004(@property详解)的相关文章

iOS复习笔记6:property详解

@property type xxx 可以自动生成一个type _xxx;成员变量: 同时还生成对应的setter和getter方法. 可以通过以下四种类型的参数,控制生成getter和setter方法. 1 set方法内存管理参数 1.1 assign: 默认值,直接赋值,使用于基础数据类型 1.2 retain: release旧值,retain新值,再赋值 1.3 copy  : release旧值,copy新值 2 是否要生成setter方法的参数 2.1 readwrite: 默认值,

IOS 学习笔记 —— UILable 使用详解(一)

1 设置字体大小 //修改字体 //    NSLog(@"fontFamily = %@", self.labelTradePrice.font.familyName);     self.labelText.font = [UIFont fontWithName:@".Helvetica Neue Interface" size:13];

IOS 学习笔记 —— tableView 使用详解(一)

1 去除分割线 //去除分割线 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 2 高度设置 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {     UITableViewCell *cell = [self tableView:tableView cellForRo

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

CoAP学习笔记——CoAP格式详解

0 前言 CoAP是受限制的应用协议(Constrained Application Protocol)的代名词.在当前由PC机组成的世界,信息交换是通过TCP和应用层协议HTTP实现的.但是对于小型设备而言,实现TCP和HTTP协议显然是一个过分的要求.为了让小设备可以接入互联网,CoAP协议被设计出来.CoAP是一种应用层协议,它运行于UDP协议之上而不是像HTTP那样运行于TCP之上.CoAP协议非常小巧,最小的数据包仅为4字节. 更多博文请参考--[物联网学习笔记--索引博文] 1 Co

Redis学习笔记4-Redis配置详解

原文:  http://blog.csdn.net/mashangyou/article/details/24555191 在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redis学习笔记中Redis的按照方式按照后,Redis的配置文件是/etc/redis/6379.conf.下面是Redis2.8.9的配置文件各项的中文解释. 1 #daemon

Struts2学习笔记二 配置详解

Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的namespace,然后在包下寻找名为HelloAction的action,反射创建控制器HelloAction对象,调用method指定的方法hello,拿到返回值“success”,去result的配置节找success对应的页面(hello.js),呈现给用户. 2.Struts的架构,具体参考这里

Struts2学习笔记(二)——配置详解

1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin.xml(配置插件) struts.xml(配置action或者常量等) struts.properties(常量配置) web.xml(配置JavaEE,如:监听器和过滤器) 2.Struts2配置文件详解 1)default.properties default.properties是Struts