属性
main.m
#import <Foundation/Foundation.h>
#import "Human.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Human *human = [[Human alloc] init];
human.name = @"tom";
NSLog(@"%@",human.name);
human.age = -10;
NSInteger age1 = human.age;
NSLog(@"sum = %ld",age1);
}
return 0;
}
Human.h
#import <Foundation/Foundation.h>
@interface Human : NSObject
//{
// NSString *_name;
// NSInteger _age;
//
//}
@property (null_resettable ,nonatomic, copy) NSString *name;
@property (nonatomic, assign, getter=isLogin) BOOL login;
@property (nonatomic, assign) NSInteger age;
@end
/*
第一类:线程有关
nonatomic:非原子性 与线程无关,通常用于单线程,速度较快。一般使用该关键字。
atomic(默认): 原子性 与线程有关,通常用于多线程。
第二类:内存管理有关
strong = retain
weak = assign
retain:修饰的对象类型,需要内存管理
assign(默认):基本数据类型,无需内存管理
copy:修饰对象类型,与内存管理有关,推荐NSString类型使用copy修饰
第三类:setter,getter
readonly:只能调用getter方法,取值
readwrite(默认):setter,getter方法都能使用
getter= :给getter方法重写命名,一般使用在Bool类型。
第四类:可空类型
nonnull:属性值不能为nil
nullable(默认):属性值可以为空
ios5 之前
1.声明下划线成员变量
2.声明属性
3.属性和和成员变量名关联(@synthesize)
ios5 之后
1.自动生成下划线成员变量
2.自动生成setter,getter的方法声明和实现
3.无需使用@synthesize将属性和成员变量名进行关联
如果手动实现了setter,getter方法中的某一个,系统会自动将另一个方法配齐。
如果手动实现setter,getter,需添加@synthesize name = _name;
*/
Human.m
#import "Human.h"
@implementation Human
{
NSString *_name;
NSInteger _age;
}
@synthesize name = _name;
- (void)setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
//无需声明和手动调用
- (NSString *)description
{
return [NSString stringWithFormat:@"name = %@,age = %ld", _name,_age];
}
@end
深复制、浅复制
copy:只有遵守了的类才可以使用copy
//地址相同
NSString *string = @"hello";
NSString *object = [string copy];
NSLog(@"copy = %@",object);
//浅复制:指针复制
NSLog(@"string = %p,object = %p",string,object);
//地址不同
NSMutableString *mutableString = [NSMutableString stringWithFormat:@"world"];
NSString *object1 = [mutableString copy];
//深复制:内容复制,复制后产生新的对象。
NSLog(@"mutable = %p, object1 = %p",mutableString, object1);
//copy对于可变对象,是深复制,对于不可变对象,是浅复制。
//copy后返回的对象都是不可变对象
mutableCopy 地址都不相同
NSString *string = [[NSString alloc] initWithFormat:@"hello"];
NSMutableString *object = [string mutableCopy];
[object insertString:@"y" atIndex:1];
NSLog(@"object = %@",object);
NSLog(@"string = %p, object = %p",string, object);
NSMutableString *mutableString = [NSMutableString stringWithFormat:@"world"];
NSMutableString *object1 = [mutableString mutableCopy];
[object1 insertString:@"u" atIndex:2];
NSLog(@"object1 = %@",object1);
NSLog(@"mutableString = %p, object1 = %p",mutableString, object1);
//mutableCopy对于可变对象或不可变对象都是深复制。并且返回的对象都是可变的。