本人最纠结的就是属性的一些细节,看注释
//
// main.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
#pragma mark----@property的使用
//属性的使用
//属性是Objective-C 2.0定义的语法,为实例变量提供了setter、 getter⽅方法的默认实现
// 属性的声明:使⽤用@property声明属性
//
// 例如:@property NSString *name; 相当于@interface中声明了两个⽅方法(setter、getter):
// - (void)setName:(NSString *)name;
// - (NSString *)name;
// 属性的实现:使⽤用@synthesize实现属性
//
// 例如:@synthesize name = _name;
// 相当于@implementation实现了setter、getter
// - (void)setName:(NSString *)name
// {...}
// - (NSString *)name
// {...}
//在这里简单说一下_object和object的区别。_object是MyClass类的成员变量,object是属性。property和synthesize定义了一对getter和setter方法,在这里的getter方法是object,setter方法是setObject,事实上getter和setter方法操作的是变量_object。
#pragma mark----属性的属性
//第一类,读写性控制(readonly/readWrite/setter/getter/) 默认readWrite
// readonly,告诉编译器,只声明getter⽅方法(⽆无setter⽅方法)。
// 例如:@property(readonly)NSString *name;
//
// //等价于 - (NSString *)name;
// readwrite,告诉编译器,既声明setter⼜又声明getter。
// 例如: @property(readwrite)NSString *name;
//
// //等价于 - (NSString *)name;
//
// - (void)setName:(NSString *)name;
// readwrite是读写性控制的默认设置
//第二类:原子性控制(nonatomic、atomic) 默认atomic
// atomic。setter、getter⽅方法在多线程访问下是绝对安全的,即 setter、getter内部做了多线程访问处理。
// 原⼦子性控制的默认设置是 atomic
// nonatomic。setter、getter⽅方法内部不会做多线程访问处理,仅仅是 普通的setter、getter⽅方法
// 程序开发过程中,setter、getter处处都在⽤用,如果使⽤用atomic,需要不断 的对setter、getter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低系统性能。 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
//第三类:语义设置(assign、retain、copy)
// assign。setter、getter内部实现是直接赋值。
//
//assign:就是简单的setter getter 方法
// retain
// 如果属性是非对象类型(比如int,float等)属性的语义设置使⽤用assign。
// 如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设置使⽤retain。
// 如果属性是对象类型并且想得到参数的copy,用copy关键字。
//
// retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,retain,是说明该属性在赋值的时候,先release
// 之前的值,然后再赋新值给属性,引用再加1。retain是创建一个指针,引用对象计数加1
//内部实现 :@property(nonatomic,retain)NSString *name;
// - (void)setName:(NSString *)name{
// if(_name != name){
//
// [_name release];
//
// _name = [name retain];
// }
//
// }
// }
// - (NSString *)name{
//
// return [[_name retain]autorelease];
//copy
// copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。copy是创建一个新对象
// 内部实现:@property(nonatomic,copy)NSString *name;
// - (void)setName:(NSString *)name{
// if(_name != name){
//
// [_name release];
//
// _name = [name copy];
// }
//
// }
// }
// - (NSString *)name{
//
// return [[_name retain]autorelease];
// 如果属性是⾮对象类型(⽐如int,float等)属性的语义设置使⽤用assign。
// 如果属性是对象类型(比如NSStrng、NSArray等)属性的语义设置使用retain。
// 如果属性是对象类型并且想得到参数的copy,使用copy关键字。
//
}
return 0;
}