您的位置:首页 > 大数据 > 人工智能

oc assign / copy / retain / 容器 / 多态

2015-08-27 09:27 471 查看
//////////////////////////////////////////////////////////////////////////

main.m

//////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

//retain copy assign 的类

#import "Student.h"

//dealloc 的类

#import "Student_dealloc.h"

#import "NSString+Characters.h"

//多态类

//#import "Animal.h" Animal在Student_Animal中引入过

#import "Bird.h"

#import "Cat.h"

#import "Student_Animal.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

#pragma mark ========== assign retain copy ==============

NSString *name=[[NSString alloc]initWithFormat:@"张三"];//1

Student *stu1=[[Student alloc]init];//1

[stu1 setName:name];//retain +1=2

[name release];//1

NSLog(@"%@",[stu1 name]);

NSLog(@"name=%@",name);

[stu1 release];//

// NSLog(@"stu1=%@",[stu1 name]);

// NSLog(@"stu1释放后name=%@",name);

#pragma mark ========== dealloc =========

Student_dealloc *student1=[[Student_dealloc alloc]init];

//点语法首先是getter方法,有了等号才是setter。

student1.name=@"张三";

student1.gender=@"男";

student1.address=@"海淀区";

student1.groupName=@"Z";

NSLog(@"%lu",student1.retainCount);

NSString *str1=[[NSString alloc]initWithFormat:@"张三"];

student1.name=str1;

[str1 release];

NSLog(@"%@",student1.name);

//copy

NSString *str2=[[NSString alloc]initWithFormat:@"女"];

student1.gender=str2;

[str2 release];

//指向一份copy后的新东西。

NSLog(@"%@",student1.gender);

//

NSString *str3=[[NSString alloc]initWithFormat:@"北京"];

student1.address=str3;

NSLog(@"%ld",str3.retainCount);

[str3 release];

//student1指针指向的str3已经没有了。但是“北京”这个内容还在,所以可能会输出北京,但是如果有其他东西跑到这来后,内容就不是北京了,所以,内存这个东西真的很恶心。为什么可以允许内容存在这。

NSLog(@"assign修饰的对象释放后再调用:%@",student1.address);

#pragma mark ====== 便利构造器 =======

Student_dealloc *stu2=[Student_dealloc student_deallocName:@"fd" Age:12];

//不能再次释放。

// [stu2 release];

#pragma mark ===== 容器 =================

Student *stuA=[[Student alloc]init];

Student *stuB=[Student studentName:@"柳柳"];

Student *stuC=[[Student alloc]initWithName:@"比比"];

NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:stuA,stuB,stuC, nil];

NSLog(@"1>>%lu,%lu,%lu",stuA.retainCount,stuB.retainCount,stuC.retainCount);

[array removeObjectAtIndex:2];//每个对象-1

NSLog(@"2>>%lu,%lu,%lu",stuA.retainCount,stuB.retainCount,stuC.retainCount);

[array removeAllObjects];

NSLog(@"3>>%lu,%lu,%lu",stuA.retainCount,stuB.retainCount,stuC.retainCount);

//1<<在容器内中,我们只需要对自己所创建的对象负责,只能释放自己拥有的对象。

//2<<凡是通过retain、copy、alloc获得的对象,代表引用计数加1。只要不使用了,就必须利用release、autorelease进行释放。

//3<<在某一代码段中,对同一对象的引用计数操作必须是相等的,前后的增加减少必须是成对出现,也是一种内存的平衡。

//4<<dealloc中,成员变量的销毁:使用retain修饰的实例对象的成员变量都必须在[super dealloc]的前面release掉。

#pragma mark ===== 多态 =================

Student_Animal *host=[[Student_Animal alloc]init];

Animal *animal=[[Animal alloc]init];

Bird *bird=[[Bird alloc]init];

Cat *cat=[[Cat alloc]init];

NSLog(@"根据传参实现多态");

[host feedFood:animal];

[host feedFood:bird];

[host feedFood:cat];

//多态实现的第一种方式:不同类型的对象,对同一个方法的不同实现。

//第二种:父类对象可以指向子类的对象。

//前面学的协议protocol也是一样的。谁遵循协议谁就实现协议里的方法。

Animal *animal_1=[[Bird alloc]init];

[host feedFood:animal_1];

}

return 0;

}

//////////////////////////////////////////////////////////////////////////

Cat.h

//////////////////////////////////////////////////////////////////////////

#import "Animal.h"

@interface Cat : Animal

@end

//////////////////////////////////////////////////////////////////////////

Cat.m

//////////////////////////////////////////////////////////////////////////

#import "Cat.h"

@implementation Cat

-(void)eat{

NSLog(@"猫来吃");

}

@end

//////////////////////////////////////////////////////////////////////////

Bird.h

//////////////////////////////////////////////////////////////////////////

#import "Animal.h"

@interface Bird : Animal

@end

//////////////////////////////////////////////////////////////////////////

Bird.m

//////////////////////////////////////////////////////////////////////////

#import "Bird.h"

@implementation Bird

-(void)eat{

NSLog(@"鸟来吃虫");

}

@end

//////////////////////////////////////////////////////////////////////////

Animal.h

//////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface Animal : NSObject

-(void)eat;

@end

//////////////////////////////////////////////////////////////////////////

Animal.m

//////////////////////////////////////////////////////////////////////////

#import "Animal.h"

@implementation Animal

-(void)eat{

NSLog(@"吃");

}

@end

//////////////////////////////////////////////////////////////////////////

Student_Animal.h

//////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

#import "Animal.h"

@interface Student_Animal : NSObject

-(void)feedFood:(Animal*)animal;

@end

//////////////////////////////////////////////////////////////////////////

Student_Animal.m

//////////////////////////////////////////////////////////////////////////

#import "Student_Animal.h"

@implementation Student_Animal

-(void)feedFood:(Animal*)animal{

[animal eat];

}

@end

//////////////////////////////////////////////////////////////////////////

NSString+Characters.h

//////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

//类目_category:为系统类扩展方法,且扩展的方法属于该类。允许被继承下去。

@interface NSString (Characters)

//将汉字转换为拼音(无音标)

- (NSString *)pinyinOfString;

//汉字转换为拼音后,返回大写的首字母

- (NSString *)firstCharacterOfString;

@end

//////////////////////////////////////////////////////////////////////////

NSString+Characters.m

//////////////////////////////////////////////////////////////////////////

#import "NSString+Characters.h"

@implementation NSString (Characters)

//将汉字转换为拼音

- (NSString *)pinyinOfString

{

NSMutableString * string = [[[NSMutableString alloc] initWithString:self ] autorelease];

CFRange range = CFRangeMake(0, 1);

// 汉字转换为拼音,并去除音调

if ( ! CFStringTransform((__bridge CFMutableStringRef) string, &range, kCFStringTransformMandarinLatin, NO) ||

! CFStringTransform((__bridge CFMutableStringRef) string, &range, kCFStringTransformStripDiacritics, NO)) {

return @"";

}

return string;

// -fno-objc-arc 如果出错就用,不出错别用。

}

//汉字转换为拼音后,返回大写的首字母

- (NSString *)firstCharacterOfString

{

NSMutableString * first = [[[NSMutableString alloc] initWithString:[self substringWithRange:NSMakeRange(0, 1)]] autorelease];

CFRange range = CFRangeMake(0, 1);

// 汉字转换为拼音,并去除音调

if ( ! CFStringTransform((__bridge CFMutableStringRef) first, &range, kCFStringTransformMandarinLatin, NO) ||

! CFStringTransform((__bridge CFMutableStringRef) first, &range, kCFStringTransformStripDiacritics, NO)) {

return @"";

}

NSString * result;

result = [first substringWithRange:NSMakeRange(0, 1)];

return result.uppercaseString;

}

@end

//////////////////////////////////////////////////////////////////////////

Student_dealloc.h

//////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

#import "NSString+Characters.h"

@interface Student_dealloc : NSObject

{

NSString *_name;

NSInteger _age;

NSString *_gender;

NSString *_address;

NSString *_groupName;

}

@property(nonatomic,retain) NSString *name;

@property(nonatomic,assign) NSInteger age;

@property(nonatomic,copy) NSString *gender;

@property(nonatomic,assign) NSString *address;

@property(nonatomic,retain) NSString *groupName;

-(id)initWithName:(NSString*)name

Age:(NSInteger)age;

+(id)student_deallocName:(NSString*)name

Age:(NSInteger)age;

-(NSString *)description;

@end

//////////////////////////////////////////////////////////////////////////

Student_dealloc.m

//////////////////////////////////////////////////////////////////////////

#import "Student_dealloc.h"

@implementation Student_dealloc

//dealloc

-(void)dealloc{

//dealloc方法执行之后,对象被销毁。

//一个类对象的实例变量(对象类型的)在引用其他对象时,可能会造成被引用对象的引用计数增加。

//对象被销毁之前,需要减少相应的引用计数。

//属性是 retain

[_name release];

[_address release];

[_groupName release];

//属性是 copy 不用release,因为copy的getter方法先retain再autorelease过。

// [_gender release];

[super dealloc];

}

-(id)initWithName:(NSString*)name

Age:(NSInteger)age{

self=[super init];

if (self) {

//防止在主函数中直接赋值是字符串对象的时候,字符串对象在堆区,引用计数为1,release后为0。如果下一次赋值还是这个字符串对象,这个时候就不给这个对象开辟新空间,但是呢,前面又release掉了,这时候就强制给他加1,这样,就不会出错。

//为了使对象正常使用,需要使用retain增加对象的引用计数,防止对象在使用期间被销毁。

_name=[name retain];

//firstCharacterOfString 返回的对象不是我们创建的, 为了。。。。。。

_groupName=[[name firstCharacterOfString] retain];

_age=age;

}

return self;

}

+(id)student_deallocName:(NSString*)name

Age:(NSInteger)age{

Student_dealloc *student=[[Student_dealloc alloc] initWithName:name Age:age];

return [student autorelease];

}

-(NSString *)description{

return [NSString stringWithFormat:@"%@,%ld",_name,_age];

}

@end

//////////////////////////////////////////////////////////////////////////

Student.h

//////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface Student : NSObject

{

NSInteger _age;

NSString *_gender;

NSString *_name;

}

@property(nonatomic,assign) NSInteger age;

@property(nonatomic,retain) NSString *name;

@property(nonatomic,copy) NSString *gender;

-(id)initWithName:(NSString*)name;

+(id)studentName:(NSString*)name;

@end

//////////////////////////////////////////////////////////////////////////

Student.m

//////////////////////////////////////////////////////////////////////////

#import "Student.h"

@implementation Student

//assign属性内部实现

-(void)setAge:(NSInteger)age{

_age=age;

}

-(NSInteger)Age{

return _age;

}

//retain属性内部实现

-(void)setName:(NSString *)name{

if (_name != name) {

[_name release];

_name=[name retain];

}

}

-(id)Name{

return _name;

}

//copy属性内部实现

-(void)setGender:(NSString *)gender{

if (_gender != gender) {

[_gender release];

_gender=[gender copy];

}

}

-(NSString*)gender{

return [[_gender retain] autorelease] ;

}

//

-(id)initWithName:(NSString*)name{

self=[super init];

if (self) {

_name=name;

}

return self;

}

+(id)studentName:(NSString*)name{

Student *student=[[Student alloc]initWithName:name];

return student;

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: