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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 消失的LM 中级黑马   /  2016-7-7 14:29  /  1906 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如现在有Person这个类,现在给Person这个类增加一个分类和一个扩展。
1、分类是不能添加属性的,但是能否在分类的.m文件中使用@property定义呢?这样定义的属性如果不报错,那么可以使用吗?
2、扩展中的.m文件中问题同上


4 个回复

倒序浏览
楼主要明白.h头文件和.m实现文件中分别要写什么内容
一个一个回答楼主的问题:
1.@property作为属性来说,在楼主设定的情景下只能写在.h声明文件中。正常的一个类来说
@property都只能定义在其.h声明中,更不用说是分类了。
所以
@property不能定义在.m文件中

2.延展是一个特殊的分类/类别,可以看做是一个匿名的分类。其自身都没有专门的.m实现文件,而需要依托其他类或单独的@implementation模块去
实现其中的方法。
说得通俗点就是只有实现这个延展的impletation才知道这个延展中具体有什么的方法和属性,所以,延展中可以追加property,但是是私有的。

不知这样回答是否解决了楼主的疑惑

回复 使用道具 举报 1 0
M.W 发表于 2016-7-7 14:54
楼主要明白.h头文件和.m实现文件中分别要写什么内容
一个一个回答楼主的问题:
1.@property作为属性来说, ...

嗯,谢谢你!
@property和.m文件之间的关系更明确了!
回复 使用道具 举报
本帖最后由 SSIrreplaceable 于 2016-7-8 12:10 编辑

一、Category
1.不同的翻译名称:分类、类别、类目(一般叫分类)
2.分类是Objective-C特有的语法,其他语言没有。
3.作用
(1).可以不用修改一个类的基础上扩充这个类
(2).一个庞大的类可以分模块开发,可以有多人开发,方便团队合作
4.注意
(1).只能增加方法,不能增加成员变量
(2).在分类中使用@property只会生成方法声明
(3).分类可以访问原来类的成员变量
(4).如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的同名方法会被忽略。
5.分类的编译顺序:多个分类有同名的方法,则执行最后编译的文件。
6.注意:不推荐写与原有类同名的方法名
7.分类名一般写分类要实现的功能或编程者的名字
8.当给Foundation框架中的类写分类时,头文件名字为“原类名+分类名.h”,实现文件名字为“原类名+分类名.m”
9.当给自己写的类分模块时,可以把分类的声明都写在原类声文件,把分类的实现写在原有类的实现文件中
如下代码:
  1. #import <Foundation/Foundation.h>

  2. @interface Cat : NSObject
  3. @property (nonatomic,copy) NSString *colour;
  4. - (void)eat;
  5. - (void)play;
  6. @end

  7. @interface Cat (skill)
  8. - (void)catchAMouse;
  9. @end
  10. ---------------------------------------------------------------------------------------------
  11. #import "Cat.h"

  12. @implementation Cat
  13. - (void)eat {
  14.   NSLog(@"吃吃吃...");
  15. }
  16. - (void)play{
  17.   NSLog(@"玩玩玩...");
  18. }
  19. @end

  20. @implementation Cat (skill)
  21. - (void)catchAMouse {
  22.   NSLog(@"抓老鼠咯...");
  23. }
  24. @end
复制代码
二、Extension
1.不同的翻译名称:扩展、延展
2.类扩展就比分类少一个分类名,但括号不能少,是分类的一个特例,也称匿名分类。
2.作用:可以为类添加一些私有的属性(成员变量、实例变量)和方法。
3.一般把类扩展写在.m文件中。
4.格式如下:
  1. #import <Foundation/Foundation.h>

  2. @interface Cat : NSObject
  3. @property (nonatomic,copy) NSString *colour;
  4. - (void)eat;
  5. - (void)play;
  6. @end
  7. -----------------------------------------------------------------------------------
  8. #import "Cat.h"

  9. @interface Cat ()
  10. - dance;
  11. @end

  12. @implementation Cat
  13. - (void)eat {
  14.   NSLog(@"吃吃吃...");
  15. }
  16. - (void)play{
  17.   NSLog(@"玩玩玩...");
  18. }
  19. - dance {
  20.   NSLog(@"跳跳跳...");
  21. }
  22. @end
复制代码




回复 使用道具 举报 1 0
SSIrreplaceable 发表于 2016-7-8 12:06
一、Category
1.不同的翻译名称:分类、类别、类目(一般叫分类)
2.分类是Objective-C特有的语法,其他语 ...

幸苦了哥们,整理得很全!谢谢了!向你学习!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马