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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Morning_jcg 于 2015-11-7 21:37 编辑

刚刚进行多文件练习的时候发生了一个有意思的“意外”,和大家分享讨论。
我用cocoa类自动创建了一对文件Goods.h和Goods.m,然后我误将Goods.m看成了Goods.h,在@implementation里进行了实例变量的定义。如下:
  1. #import "Goods.h"

  2. @implementation Goods{
  3.     //实例变量
  4.     int _gid;
  5.     NSString * _name;
  6. }
  7. //set方法
  8. -(void)setName:(NSString*)name{
  9.     _name=name;
  10. }
  11. -(void)setGid:(int)gid{
  12.    
  13.     _gid=gid;
  14. }
  15. //get方法
  16. -(NSString*)name{
  17.     return _name;
  18. }
  19. -(int)gid{
  20.     return _gid;
  21. }
  22. @end
复制代码

/*非规范代码,请勿模仿*/

然后我意识到错误的时候发现,xcode的预编译竟然没有报错!会不会这么写也可以?于是我做了一次尝试。我在头文件的@interface中仅申明了对象方法,代码如下:
  1. #import <Foundation/Foundation.h>

  2. @interface Goods : NSObject
  3. -(void)setName:(NSString*)name;
  4. -(void)setGid:(int)gid;
  5. -(NSString*)name;
  6. -(int)gid;
  7. @end
复制代码

然后在main函数里尝试通过调用set和get方法,看看是否可以对我在@implementation中申明的实例变量进行,也就是说我想看看我定义在@implementation里的东西是不是能和定义在@interface里定义的一样有效果。于是我写了如下代码:
  1. #import <Foundation/Foundation.h>
  2. #import "Goods.h"



  3. int main(int argc, const char * argv[]) {
  4.     @autoreleasepool {
  5.         // insert code here...
  6.         Goods * test=[Goods new];       //创建对象
  7.         [test setName:@"goods1"];
  8.         [test setGid:100];
  9.         NSLog(@"%@",[test name]);
  10.         NSLog(@"%d",[test gid]);
  11.         
  12.     }
  13.     return 0;
  14. }
复制代码
编译运行没有报错,同时输出也是预想的结果:


所以我在@implementation里定义的实例变量是确实发挥着作用的。
这虽然是一种不规范的代码格式,但由此却提出一个问题,@interface和@implementation的作用与界限究竟是什么。等待各位大神来解决我的疑惑。




2 个回复

倒序浏览
又抽风,,修改完毕。
回复 使用道具 举报
没有大神评论回答么?自顶一发,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马