A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1      代码中字符串换行
NSString *string = @"ABCDEFGHIJKL" \
         "MNOPQRSTUVsWXYZ";

2    没有用到类的成员变量的,都写成类方法

3    category可以用来调试
    可以隐藏私有方法,最主要的是用它截住函数。
    例1:测试时我想知道TableViewCell有没有释放,就可以这样写
@implementation UITableViewCell(dealloc) 
-(void)dealloc 
{ 
   NSLog(@"%@",NSStringFromSelector(_cmd)); 
    NSArray *array = allSubviews(self);         // allSubviews是cookBook里的函数,可以取一个view的所有subView ,在这个文档后面也有
    NSLog(@"%@",array); 

    [super dealloc]; 
} 
@end

例2:我调试程序,觉得table的大小变了,想找到在哪改变的,这样做:
@implementation UITableView(setframe) 
-(void)setFrame:(CGRect)frame 
{ 
   NSLog(%"%@",self); 
    [super setFrame: frame]; 
} 
@end

category和exension的区别:
category:
a.类别是一种为现有的类添加新方法的方式。
利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。
b.声明类别
@interface NSArray (MArrayCateoryDemo)
-(NSArray*) orderByTime;
@end

实现类别
@implementation NSArray (MArrayCateoryDemo)
-(NSArray*) orderByTime{
    NSArray *demo = [self ...];
    return demo;
}
@end

调用:
NSArray * array = ..;
NSArray = [array orderByTime];
三、类别的局限性
有两方面局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

c 类别的作用
类别主要有3个作用:
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

5. extension
@interface MyObject(){
    int iextension;
}
-(void)testInExtension;
@end
他们的主要区别是:
1、形式上来看,extension是匿名的category。
2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。
3、extension可以添加属性(变量),category不可以。


6.block
声明block
void(^blockDemo)(void);
定义block
blockDemo = ^{
    ...
};
声明和定义在一起
void(^blockDemo)(void) = ^ {
    ...
};

前面一个void是返回值类型,后面括号里面void是参数类型,此例中表明没有返回值和参数。

如何使用举例:
比如请求网络数据,声明一个block用来传递请求到的数据:
void(^requestData)(NSData *id);

定义一个获取数据的方法
- (void)requestDataWithBlock:(void (^)(NSData* data))pBlock {
    NSData *data = [NSData data];
   
    pBlock(data);
}

调用该方法去获取数据。
[self requestDataWithBlock:^(NSData *data) {
        if (data) {
           ...
        } else {
            ...
        }
    }];

为了延长block的生命周期,可以将其声明为类的成员变量。
typedef void(^blockDemo)(void);

@interface MyObject() {
    blockDemo demoBlock;
   
}
@end

很需要注意的一点就是,block内local variable是會自動做retain的, 而用到的外部成员也会自动retain, 而這就很容易造成retain cycle。为了解决这个问题,在使用外部成员时都应该在使用之前加上__block。


7.    使用自定义字体
1.添加对应的字体(.ttf或.odf)到工程的resurce,例如my.ttf。
2.在info.plist中添加一项 Fonts provided by application (item0对应的value为my.ttf,添加多个字体依次添加就可以了)。
3.使用时aLabel.font=[UIFontfontWithName:@"XXX" size:30]; 注意XXX不一定是my,这里是RETURN TO CASTLE。
可以用如下方法查看familyname和fontname:
NSArray *familyNames = [UIFont familyNames];
    for( NSString *familyNameinfamilyNames ){
        printf( "Family: %s \n", [familyNameUTF8String] );
        NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
        for( NSString *fontNameinfontNames ){
            printf( "\tFont: %s \n", [fontNameUTF8String] );
        }
    }



8     后台运行
IOS允许长时间在后台运行的情况有7种:
audio
VoIP
GPS
下载新闻
和其它附属硬件进行通讯时
使用蓝牙进行通讯时
使用蓝牙共享数据时

除以上情况,程序退出时可能设置短暂运行10分钟


9 关于UITableView   
任意设置Cell选中状态的背景色:
UIView *bgView = [[UIView alloc] init];
bgView.backgroundColor = [UIColor orangeColor];
self.selectedBackgroundView = bgView;
[bgView release];
该方法设置的是纯色, 也可以使用任何图片,把selectedBackgroundView设成UIImageView。
但要注意,选中取消时,需要取消颜色,self.selectedBackgroundView = nil,否则颜色一直在。

除了上面的方法,前几天发现了一个新方法:重写UITableViewCell 的 setSelected:animated:方法
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
   if (selected) {
      self.backgroundColor = RGB(224, 152, 40);
   }
   else {
      self.backgroundColor = [UIColor clearColor];
   }
}

flashScrollIndicators
这个很有用,闪一下滚动条,暗示是否有可滚动的内容。可以在ViewDidAppear或[table reload]之后调用。

    点击Cell中的按钮时,如何取所在的Cell:
-(void)OnTouchBtnInCell:(UIButton *)btn 
{ 
  CGPoint point = btn.center; 
  point = [table convertPoint:point fromView:btn.superview]; 
  NSIndexPath* indexpath = [table indexPathForRowAtPoint:point]; 
  UITableViewCell *cell = [table cellForRowAtIndexPath:indexpath]; 
  ...
  // 也可以通过一路取btn的父窗口取到cell,但如果cell下通过好几层subview才到btn,就要取好几次 superview
  // 所以我用上面的方法,比较通用。这种  方法也适用于其它控件。 
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马