OC的代理问题

       OC可以告一段落了,OC总体来说确实不难,难点在于资料不多,且大部分是老外所写。而且OC语法与其他的常用语言如C、C++、Java、C#相差太大。老外的书写的固然好(国内一部分书基本都是照抄的,呵呵),但书的风格与我们习惯的不太一样,再经过翻译后,这些书对于初学者来说就很苦涩了,很容易被绕晕。个人认为先看国内写的书,基本掌握OC后,再去看国外的经典著作。
    代理就是让一个类去完成自己想完成的工作,如我让他去买早点。代理提供了一种方法,这种方法可以使得类里面的类对象可以调用当前类的方法。 简单来说就是有个A类,A类里面声明了类B的对象,那么通过代理可以让B的对象调用A的方法.
    也不一定非要是复合的这种情况才使用代理,两个独立的类也可以代理来调用对方的方法(想起了C++里面的招式,有两个类A,B,给B的方法传个A的对象,那么就可以调用A的方法了)。
    这次是个复合、协议、代理的综合运用,模拟了通讯录的使用,在列表类可以选择联系人,显示所有联系人的基本情况,详细类里面显示详细信息、删除联系人。共1个主程序,2个类文件


主程序:


//
//  main.m
//  Delegate 协议、代理、复合的综合
//  Created by GPH on 14-7-1.
//  Copyright (c) 2014年 GPH. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Detail.h"
#import "List.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        List *list1 = [List alloc];
        list1.dataArr = [NSMutableArray
                         arrayWithCapacity:0];
        //模拟数据
        for (int i = 0; i < 5; i++)
        {
            NSDictionary *dic =
            [NSDictionary
            dictionaryWithObjectsAndKeys:
            [NSString stringWithFormat:@"联系人%d",i],@"name",
            [NSString stringWithFormat:@"电话%d",i],@"tel",
            [NSString stringWithFormat:@"住址%d",i],@"address",
            [NSString stringWithFormat:@"邮箱%d",i],@"email",nil];
            //添加进去
            [list1.dataArr addObject:dic];

        }
        //显示所有联系人
        [list1 showList];
        //选择联系人
        [list1 selectAPeople:2];
        //显示详情
        [list1.detial showDetail];
        //删除当前的联系人
        [list1.detial deleteTheContact];
    }
    return 0;
}

俩个类文件的声明

//
//  List.h
//  Delegate
//
//  Created by GPH on 14-7-1.
//  Copyright (c) 2014年 GPH. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Detail.h"
//遵守协议,以便被调用
@interface List : NSObject<deleteDelegate>
//存放字典
@property(nonatomic,retain) NSMutableArray* dataArr;
@property(nonatomic,retain) Detail *detial;
-(void)showList;
//要看这个人的详情
-(void)selectAPeople:(int)row;
@end

//
//  Detail.h
//  Delegate
//
//  Created by GPH on 14-7-1.
//  Copyright (c) 2014年 GPH. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol deleteDelegate <NSObject>
-(void)removeObject:(NSDictionary*)dic;
@end

@interface Detail : NSObject
@property(nonatomic,assign)id<deleteDelegate>delegate;
@property(nonatomic,retain) NSDictionary *detail;
-(void)showDetail;
//删除
-(void)deleteTheContact;
@end

俩个类文件的实现

//
//  List.m
//  Delegate
//
//  Created by GPH on 14-7-1.
//  Copyright (c) 2014年 GPH. All rights reserved.
//

#import "List.h"
@implementation List
//显示所有
-(void)showList
{
    for (int i = 0; i < [self.dataArr count]; i++)
    {
        NSLog(@"姓名:%@,电话%@",
              [[self.dataArr objectAtIndex:i]objectForKey:@"name"],
              [[self.dataArr objectAtIndex:i]objectForKey:@"tel"]);
    }
}

//要看这个人的详情
-(void)selectAPeople:(int)row
{
    self.detial = [Detail alloc];
    self.detial.detail = [self.dataArr objectAtIndex:row];
    self.detial.delegate = self;
}

-(void)removeObject:(NSDictionary *)dic
{
    [self.dataArr removeObject:dic];
    //刷新一下
    [self showList];
}
@end


//
//  Detail.m
//  Delegate
//
//  Created by GPH on 14-7-1.
//  Copyright (c) 2014年 GPH. All rights reserved.
//

#import "Detail.h"

@implementation Detail
-(void)showDetail
{
    NSLog(@"姓名:%@,电话:%@,住址:%@,邮箱:%@",
      [self.detail objectForKey:@"name"],
      [self.detail objectForKey:@"tel"],
      [self.detail objectForKey:@"address"],
      [self.detail objectForKey:@"email"]);
}

-(void)deleteTheContact
{
    NSLog(@"这个人 %@ 被删了",[self.detail objectForKey:@"name"]);
    [self.delegate removeObject:self.detail];
}
@end

效果:

 姓名:联系人0,电话电话0
 姓名:联系人1,电话电话1
 姓名:联系人2,电话电话2
 姓名:联系人3,电话电话3
 姓名:联系人4,电话电话4
 姓名:联系人2,电话:电话2,住址:住址2,邮箱:邮箱2
 这个人 联系人2 被删了
 姓名:联系人0,电话电话0
 姓名:联系人1,电话电话1
 姓名:联系人3,电话电话3
 姓名:联系人4,电话电话4


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值