蓝少泽

天生我材必有用,千金散去还复来。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

  

posted on 2013-05-17 15:44  蓝少泽  阅读(281)  评论(0编辑  收藏  举报