---------------- ASP.Net+Unity开发、.Net培训、期待与您交流!----------------
《OC14-Category》学习总结
1、Category可以动态的为已经存在的类添加新的方法。
2、Category可以在其他文件中对某个类进行扩展,不需要创建子类,实现了软件开发的模块化。
3、@interface Student (Test):()代表着是一个分类,()中的Test代表分类的名称。
4、分类只能扩展方法,不能增加成员变量。
5、Category示例。
#import <Foundation/Foundation.h>
@interface Student : NSObject
// Student类只有一个test方法.
- (void)test;
@end
#import "Student.h"
@interface Student (Test)
// 向Student类添加test2方法.
- (void)test2;
@end
#import "Student+Test.h"
@implementation Student (Test)
// test2方法实现.
- (void)test2 {
}
@end
《OC15-Protocol》学习总结
1、Protocol可以用来声明一大堆方法,其中声明的方法可以被任何类实现。
2、只要某个类遵守了这个协议,就相当于拥有了这个协议中的所有方法声明。
4、只要父类遵守了某个协议,就相当于子类也遵守了。
5、可以同时遵守多个协议。
6、当协议只用于这个类的时候,写在里面,当协议用于多个类的时候,写在外面。
7、@protocol对协议进行提前声明,跟@class的用途是一致的。
8、@protocol ButtonDelegate <NSObject>:<>代表实现某个协议,<>中的NSObject代表协议的名称。
《OC16-Block》学习总结
1、Block封装了一段代码,可以在任何时候执行。
2、Block可以作为函数参数或函数的返回值,而其本身又可以带输入参数或者函数的返回值。
3、Block和函数指针的区别:Block是内联函数,并且默认情况下它对局部变量是只读的。
4、苹果官方建议尽量多的使用Block。
5、Block内部可以访问外部的变量。
6、Block默认情况下不能修改外面的局部变量,但给局部变量加上__block关键字,这个局部变量就可以在Block内部修改。
7、block示例。
#import <Foundation/Foundation.h>
// Button是一个类.
@class Button;
typedef void (^ButtonBlock) (Button *);
@interface Button : NSObject
// 生成set方法和get方法.
@property (nonatomic, assign) ButtonBlock block;
// 声明click方法.
- (void)click;
@end
#import "Button.h"
@implementation Button
// 调用block实现click方法.
- (void)click {
_block(self);
}
@end
#import <Foundation/Foundation.h>
#import "Button.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Button *btn = [[[Button alloc] init] autorelease];
// 使用block封装NSLog这段代码.
btn.block = ^(Button *btn) {
NSLog(@"按钮-%@被点击了", btn);
};
// 模拟按钮点击.
[btn click];
}
return 0;
}