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
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
相关文章推荐
- oc MRC内存管理机制alloc/retain/copy/release/autorelease
- Syntax error, type annotations are available only when source level is at least 1.8
- install ftp client on kail
- Container With Most Water
- LightOJ 1403 - Air Raid【二分匹配】
- Leetcode: Contains Duplicate
- Leetcode: Factorial Trailing Zeroes
- ideaiu的使用
- CCComponentContainer,CCComponent解析
- 安装APK:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
- 异常:org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection available
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) B. Minimization 贪心 dp
- LeetCode题解:Factorial Trailing Zeroes
- HDU2473 - Junk-Mail Filter 利用虚拟数组实现删除并查集的节点
- 【图论】【最小生成树】[IOI2003]maintain
- [捉虫记录]关于Cascade Training Error的bug
- failure during conversion to COFF: file invalid or corrupt
- 【HDOJ 1021】 Fibonacci Again (矩阵快速幂(裸))
- HDOJ 2674 N!Again(找规律)
- 人工智能进入股市操盘获利巨大激荡股市