29.Object copy(类对象复制):
#import "MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h" MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *talkingiPhone = [[MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone alloc] init]; talkingiPhone.phoneName = @"Mr. Higgie"; [talkingiPhone decreaseBatteryLife:@5]; MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *_copy_ = [talkingiPhone copy];//调用copy关键字,将_copy_对象与talkingiPhone指向相同的内存空间
[_copy_ reportBatteryLife];
30.Responds to message:
Change:
#import "MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h" MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *talkingiPhone = [[MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone alloc] init]; talkingiPhone.phoneName = @"Mr. Higgie"; [talkingiPhone decreaseBatteryLife:@5]; if([talkingiPhone respondsToSelector:@selector(copyWithZone)]){//通过respondsToSelector:去判断是否可以响应信息,copyWithzone字段来判断是否可以copy。
MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *copy = [talkingiPhone copy];
[copy reportBatteryLife]; }
31.Implements copyWithZone:
MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h
@interface MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone : NSObject<NSCopying> {//拥有了NSCopying协议,必须是实现copyWithZone方法
NSNumber *_batteryLife; }
@property NSString *phoneName;
@property NSString *modelNumber;
- (void) decreaseBatteryLife:(NSNumber *)arg;
- (NSString *) speak:(NSString *)greeting;
- (void) reportBatteryLife; @end
MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.m
#import "MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h" @implementation MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone - (MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *)init; { _batteryLife = @100; return [super init]; }
//通过实现copyWithZone方法返回一个拥有内存空间的类对象 -(MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *) copyWithZone:(NSZone *)zone; { MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *mh = [[MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone allocWithZone:zone] init]; return mh; } - (void) decreaseBatteryLife:(NSNumber *)arg; { _batteryLife = @([_batteryLife intValue] - [arg intValue]); } - (void) reportBatteryLife; { NSLog(@"%@'s battery life is %@", self.phoneName, _batteryLife); } - (NSString *)speak:(NSString *)greeting; { NSString *message = [NSString stringWithFormat:@"%@ says %@", self.phoneName, greeting]; return message; } @end
32.what is nil(null)?
在Object-C中,nill就是Java中的null
MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.m
#import "MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h" @implementation MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone - (MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *)init; { _batteryLife = @100; return [super init]; } - (MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *) copyWithZone:(NSZone *)zone; { MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *copy = [[MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone allocWithZone:zone] init]; return copy; } - (void) decreaseBatteryLife:(NSNumber *)arg; { _batteryLife = @([_batteryLife intValue] - [arg intValue]); } - (void) reportBatteryLife; { if(self.phoneName){ NSLog(@"%@'s battery life is %@", self.phoneName, _batteryLife); }else{//如果只为nil的时候执行 NSLog(@"%@'s battery life is nil"); }
//也可以写成
//if([self.phoneName isEqualToString:@"Mr. Higgie"]){
//NSLog(@"phoneName is equal to Mr. Higgie");
//}else{
//NSLog(@"phoneName is not equal to Mr. Higgie");
//}
}
- (NSString *)speak:(NSString *)greeting; { NSString *message = [NSString stringWithFormat:@"%@ says %@", self.phoneName, greeting];
return message;
}
@end
33.自定义初始化程序:
MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h
@interface MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone : NSObject <NSCopying> { NSNumber *_batteryLife;//实例变量 } @property NSString *phoneName; @property NSString *modelNumber;
//自定义的初始化程序方法,以init开头,可以替代系统自带的init方法,实现变量的初始化操作。
- (MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *)initWithBatteryLife:(NSNumber *)batteryLife;
- (void) decreaseBatteryLife:(NSNumber *)arg;
- (NSString *) speak:(NSString *)greeting;
- (void) reportBatteryLife;
@end
MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.m
#import "MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone.h" @implementation MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone -(MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *)initWithBatteryLife:(NSNumber *)batteryLife; { _batteryLife = batteryLife; }
//实现自定义的初始化方法 - (MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *) copyWithZone:(NSZone *)zone; { MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone *copy = [[MrHiggieIsAnAmazingPhoneAndIsLovedByEveryone allocWithZone:zone] initWithBatteryLife:_batteryLife]; copy.phoneName = [NSString stringWithFormat:@"Copy of %@", self.phoneName]; return copy; } - (void) decreaseBatteryLife:(NSNumber *)arg; { _batteryLife = @([_batteryLife intValue] - [arg intValue]); } - (void) reportBatteryLife; { if(self.phoneName){ NSLog(@"%@'s battery life is %@", self.phoneName, _batteryLife); }else{ NSLog(@"%@'s battery life is %@", self, _batteryLife); } } - (NSString *)speak:(NSString *)greeting; { NSString *message = [NSString stringWithFormat:@"%@ says %@", self.phoneName, greeting]; return message; } @end
34.Object Class:
类方法前含有-或+,-代表该方法为实例方法,+代表该方法为类方法,方法中每个冒号后边有且只有一个参数。
// // Oc_2.h // ObjectClass // // Created by Jack-Lu on 15/4/11. // Copyright (c) 2015年 Jack-Lu. All rights reserved. // #import <Foundation/Foundation.h> @interface Oc_2 : NSObject { //类得接口部分 NSString * name; NSInteger age; NSString* gender; } //初始化方法,获得一个实例对对象 -(id)initWithName : (NSString *)_name; -(void)sayHi; //设置器 -(void)setName:(NSString *)_name; -(void)setAge:(NSInteger)_age; -(void)setGender:(NSString*)_gender; //访问器 -(NSString *)getName; -(NSInteger)getAge; -(NSString *)getGender; @end
// // Oc_2.m // ObjectClass // // Created by Jack-Lu on 15/4/11. // Copyright (c) 2015年 Jack-Lu. All rights reserved. // #import "Oc_2.h" @implementation Oc_2 //初始化方法,获得一个实例对对象 -(id)initWithName : (NSString *)_name { //1.原始初始化 self = [super init]; //2.原始初始化成功之后,需要设置当前对象的姓名为形参 if(self!=nil) { name=_name; } //3.返回当前对象 return self; } -(void)sayHi { NSLog(@"hello world"); } //设置器 -(void)setName:(NSString *)_name { name=_name; } -(void)setAge:(NSInteger)_age { age=_age; } -(void)setGender:(NSString*)_gender { gender=_gender; } //访问器 -(NSString *)getName { return name; } -(NSInteger)getAge{ return age; } -(NSString *)getGender{ return gender; } @end
// // main.m // ObjectClass // // Created by Jack-Lu on 15/4/11. // Copyright (c) 2015年 Jack-Lu. All rights reserved. // #import <Foundation/Foundation.h> #import "Oc_2.h" int main(int argc, const char * argv[]) { /* @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } */ //1.创建类对象 Oc_2 *person = [[Oc_2 alloc]initWithName:@"jack"]; //2.给Person发送实例消息sayhi [person sayHi]; //3.打印当前Oc_2实例对象的姓名 NSLog(@"person's name is %@",[person getName]); //4.修改当前对象的姓名 [person setName:@"james"]; NSLog(@"person's name is %@",[person getName]); return 0; }
35.memory manage
OC内存管理分为:
(1)自动回收内存(Arc ios5提供),非java、C#垃圾回收机制,采用retainCount(引用技术机制)管理对象所占用的内存
(2)手动管理
分配内存 alloc,销毁内存 dealloc。
NSObject默认含有一个整型变量,用于计数,当发送alloc消息后,获得的实例对象的引用计数赋值为1,当引用计数为0后,自动对该对象发送dealloc消息(永远不要手动调用dealloc)。
- 常用方法
- copy(制造一个副本,将副本的引用计数赋值为1,拥有副本的所有权)
- autorelease(未来某个时间对象引用计数-1,并放弃对象所有权)
- release(对象引用-1,并放弃对象所有权)
- retain(对象引用计数+1,并拥有对象所有权)
- 内存管理原则
- 凡是alloc、retain、copy的地方,都应出现release或autorelease与之对应
- 属性为retain(@property(retain))、copy(@property(copy))的话,需要在类的dealloc中释放属性
- 便利构造器本身应包含autorelease,[object autorelease]
- 一定不要释放没有所有权的对象,不要手动调用dealloc