首先创建一个cocoa class ,命名为Person,
Person.h:
//
// Person.h
// SetAndGet
//
// Created by 千 on 16/7/27.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSUInteger _age;//注意这里是无符号的
NSString *_sex;
}
-(void)setName:(NSString *)name;
-(void)setAge:(NSUInteger)age;//注意这里是无符号的
-(void)setSex:(NSString *)sex;
//这里的get的方法是不需要参数的
-(NSString *)name;
-(NSUInteger)age;
-(NSString *)sex;
@end
Person.m
//
// Person.m
// SetAndGet
//
// Created by 千 on 16/7/27.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import "Person.h"
@implementation Person
//在nar下面需要执行delloc
/*
-(void)dealloc{
[_name release];
[super dealloc];
}
//++++++++++++
//在nar下面,如果要优化的话
-(void)setName:(NSString *)name{
if(name!=_name){
[_name release];
_name=name;
}
}
*/
-(void)setName:(NSString *)name{
_name=name;
}
-(void)setAge:(NSUInteger)age{
_age=age;
}
-(void)setSex:(NSString *)sex{
_sex=sex;
}
-(NSString *)name{
return _name;
}
-(NSUInteger)age{
return _age;
}
-(NSString *)sex{
return _sex;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"name=%@,age=%zd,sex=%@",_name,_age,_sex];
}
@end
main.c
//
// main.m
// SetAndGet
//
// Created by 千 on 16/7/26.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Person *person =[[Person alloc] init];
[person setName:@"kodulf"];
[person setAge:29];
[person setSex:@"Men"];
NSLog(@"person %@\n",person);
NSLog(@"person age=%zd\n",[person age]);
//默认的工程是运行在arc下面的,里面的实现逻辑非常简单
//如果现在工程的内存管理交给我们程序猿,那么改成手动的引用的技术
//第一步:修改arc的设置,
//点击这个项目的名称,这里就是SetAndGet 右边的Build Settings,
//在里面搜索gar,然后修改Automatic Reference Counting 为no
//这个时候就会在在nrc的逻辑下面了
//首先需要person的release,然后类中需要dealloc
//[person release];
//_________点语法,本质是调用get和set方法,只是默认的都是直接person.name
person.name=@"tim";//点语法,可以读成的person的name等于,注意名字是name ,而不是_name
NSLog(@"person.name=%@",person.name);
}
return 0;
}
属性生成器:
//有了属性生成器之后会自动的生成get和set方法,
//如果有了属性生成器,可以省略掉上面的属性声明
创建一个Person:
Person.h
//
// Person.h
// PropertiesCreatorDemo
//
// Created by 千 on 16/7/27.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSUInteger _age;
NSString *_sex;
}
//有了属性生成器之后会自动的生成get和set方法,
//如果有了属性生成器,可以省略掉上面的属性声明
@property NSString *name;
@property NSUInteger age;
@property NSString *sex;
@end
Person.m
//
// Person.m
// PropertiesCreatorDemo
//
// Created by 千 on 16/7/27.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import "Person.h"
@implementation Person
@end
Main.m
//
// main.m
// PropertiesCreatorDemo
//
// Created by 千 on 16/7/27.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//有了属性生成器之后会自动的生成get和set方法
Person *person =[[Person alloc] init];
person.age = 12;
person.name=@"kodulf";
person.sex=@"Man";
NSLog(@"name= %@",person.name);
}
return 0;
}
mac:
首先要改arc的改成no,就是build setting那里的gar改成no
编译一下就是在我们的mrc的环境下了
。m文件中的set方法的实现逻辑就不能是简单的赋值了,我们这样的操作,你们只是完成了地址的简单传递,并不能去持有我们这个对象的绝对使用权。所以为了能让我们保证我们操作对象的声明周期在我们使用期间一直存在,我们必须去使用我们内存管理中的retain方法进行对象的一个强引用,首先我们在这里先回顾一下,内存管理原则,创建person使用了alloc了,那么是不是要在我们下面对应的位置,也就是我们person这个对象使用完成之后,我们对应要进行一个release,这样才能保证我们的内容不被泄漏,除此之外,我们来看看
_name =[name retain]我们必须调用对象的强引用来保证我们使用期间,对象是一只存在的。
好的,我们大家可以看到,这里面又出现了我们内存管理原则里面的一个方法了
有了强引用之后,我们使用完了之后,就要在相应的位置上进行一个release
这里面,我们在类的内部,一般去释放我们的对象,我们都要写在dealloc 里面
它和我们person的生命周期进行一个同步,这个是我们setname这个方法,有了这样一个强引用之后,我们再来看下面:
有了这样一个强应用之后,我们假设外部两次的赋值结果都是相同的值,那么我们就可以考虑一下,第二次赋值,让他不再走retain的逻辑,节省一下我们的执行逻辑
所以这里可以像下面一样添加一个判断
-(viod)dealloc{
[_name release];
[super dealloc];
}
-(void)setName:(NSString *)name{
if(name!=_name){
_name = [name retain];
}
}
除此之外,我们还要注意,如果我们第二次再次赋值的时候
我们肯定要写一个[_name release] 先完成对上一次之前的赋值结果的成功的让它释放掉,接下来我们才对新值进行retain,这样才能够保证,我们的内存不至于去泄漏
如果不添加release这句话的话,那么上一你去强引用的对象,你直接给他人掉了,没有人去管它了,这样我们的内存就会泄漏了
-(viod)dealloc{
[_name release];
[super dealloc];
}
-(void)setName:(NSString *)name{
if(name!=_name){
[_name release]
_name = [name retain];
}
}
我们看下面的这两个方法,setAge不用管,因为是基本数据类型,
setSex的方法,我们直接复制上面的代码到这里,然后修改相应的变量
- (void)setAge:(NSUInteger) age{
_age = age;
}
- (void)setSex:(NSString *)sex{
_sex = sex;
if(sex!=_sex){
[_sex release]
_sex = [sex retain];
}
}
不要忘记在上面的dealloc 里面也要对我们的_sex进行release
-(viod)dealloc{
[_name release];
[_sex release];
[super dealloc];
}
所以可以看到,在mrc模式下,我们需要考虑的逻辑很多,我们要考虑:
考虑内存是否每一步都做到一个平衡管理,所以可以看到,
当我们在不同的文件,不同的代码逻辑中去使用我们mrc内存管理,你很可能会有内存泄露哦的地方,这也是我们苹果公司后续支持arc的一个原因
在我们mrc下,我们的get方法和我们的arc下面是一样的,就是
首先我们去惦记一个product,点击analyze看一下有没有内存泄漏,没有的话,我们运行程序,