黑马程序员技术交流社区
标题:
protocol的内存管理出问题了,大家来瞄瞄
[打印本页]
作者:
崔石炫
时间:
2014-10-23 23:43
标题:
protocol的内存管理出问题了,大家来瞄瞄
// SuperProtocol.h
#import <Foundation/Foundation.h>
@protocol SuperProtocol <NSObject>
//NSObject协议称为基协议,每个协议都应当遵守NSObject协议,就像每个类都应当继承NSObject类一样。
@required
- (void)speak;
- (void)eat;
- (void)walk;
@end
复制代码
// SubProtocol.h
#import <Foundation/Foundation.h>
#import "SuperProtocol.h"
@protocol SubProtocol <SuperProtocol>
//SubProtocol协议遵守SuperProtocol协议,就拥有了SuperProtocol协议中的所有方法声明,类似于继承
@required //一定要实现@required的方法,否则编译器报警
- (void)study;
- (void)speakEnglish;
@optional //可选,不要求一定实现
- (void)drive;
@end
复制代码
// MyProtocol.h
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
@required
- (void)drink;
@optional
- (void)smoke;
@end
复制代码
这是3个协议文件的代码
Person类
// Person.h
#import <Foundation/Foundation.h>
#import "SuperProtocol.h"
@interface Person : NSObject <SuperProtocol>
@property (nonatomic , assign) NSString *name;
+ (id)person;
@end
/*
提前声明协议,在.m文件中使用时在import头文件:
* @protocol 协议名;
类遵守协议,就拥有了协议中的所有方法声明:
* Person类拥有了SuperProtocol协议中的所有方法声明
*/
复制代码
// Person.m
#import "Person.h"
@implementation Person
+ (id)person
{
return [[self alloc] init];
}
- (void)walk
{
NSLog(@"%@走路" , _name);
}
- (void)speak
{
NSLog(@"%@说话" , _name);
}
- (void)eat
{
NSLog(@"%@吃东西" , _name);
}
- (void)dealloc
{
NSLog(@"%@被回收" , _name);
}
@end
复制代码
Student类
// Student.h
#import "Person.h"
#import "SubProtocol.h"
#import "MyProtocol.h"
@interface Student : Person <SubProtocol , MyProtocol>
//遵守多个协议
@property(nonatomic , assign) int number;
+ (id)student;
@end
/*
类只能继承一个父类,但可以同时遵守多个协议,拥有所有协议中的方法声明
Student类继承自Person类,并且同时遵守SubProtocol协议和MyProtocol协议
*/
复制代码
// Student.m
#import "Student.h"
@implementation Student
+ (id)student //快速构造器
{
return [[self alloc] init];
}
- (void)study
{
NSLog(@"%@学习" , self.name);
}
- (void)speakEnglish
{
NSLog(@"%@说英语" , self.name);
}
- (void)drive
{
NSLog(@"%@开车" , self.name);
}
- (void)drink
{
NSLog(@"%@喝" , self.name);
}
- (void)smoke
{
NSLog(@"%@抽烟" , self.name);
}
- (void)dealloc
{
NSLog(@"%@被回收" , self.name);
}
@end
复制代码
main.m
// main.
/*
protocol:用于声明方法
* 类遵守协议:类就拥有了协议中的方法声明
* 协议遵守协议:新协议拥有遵守的协议的方法声明,类似继承
* 遵守多个协议:拥有所有遵守的协议的方法声明(类只能继承一个父类)
protocol限制对象类型:
要继承的类名<要遵守的协议名列表> *pointer;
例如:Person<protocol1 , protocol2> *p;
限制p指向的对象必须继承了Person,并且遵守了protocol1 , protocol2这2个协议
*/
#import <Foundation/Foundation.h>
#import "Student.h"
#import "SuperProtocol.h"
#import "SubProtocol.h"
#import "MyProtocol.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person<SuperProtocol> *p = [Person person];//限制p的对象类型:必须继承Person类,并且遵守SuperProtocol协议
p.name = @"张三";
[p eat];
[p speak];
[p walk];
Student<SubProtocol , MyProtocol> *s = [Student student];//限制s的对象类型:必须继承自Student类,且遵守SubProtocol , MyProtocol两个协议
s.name = @"李四";
//[s setName:@"李四"];
s.number = 999;
//李四遵守了多个协议,拥有这些协议中所有方法声明
[s eat];
[s speak];
[s walk];
[s study];
[s speakEnglish];
[s drive];
[s drink];
[s smoke];
}
return 0;
}
复制代码
为什么李四会回收2次???
2014-10-23 23:43:09.337 24_protocol基本[1457:303] 张三吃东西
2014-10-23 23:43:09.338 24_protocol基本[1457:303] 张三说话
2014-10-23 23:43:09.338 24_protocol基本[1457:303] 张三走路
2014-10-23 23:43:09.338 24_protocol基本[1457:303] 李四吃东西
2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四说话
2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四走路
2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四学习
2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四说英语
2014-10-23 23:43:09.339 24_protocol基本[1457:303] 李四开车
2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四喝
2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四抽烟
2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四被回收
2014-10-23 23:43:09.340 24_protocol基本[1457:303] 李四被回收
2014-10-23 23:43:09.340 24_protocol基本[1457:303] 张三被回收
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2