黑马程序员技术交流社区
标题:
[OC]类创建小试中发生了“意外”
[打印本页]
作者:
Morning_jcg
时间:
2015-11-7 21:25
标题:
[OC]类创建小试中发生了“意外”
本帖最后由 Morning_jcg 于 2015-11-7 21:37 编辑
刚刚进行多文件练习的时候发生了一个有意思的“意外”,和大家分享讨论。
我用cocoa类自动创建了一对文件Goods.h和Goods.m,然后我误将Goods.m看成了Goods.h,在@implementation里进行了实例变量的定义。如下:
#import "Goods.h"
@implementation Goods{
//实例变量
int _gid;
NSString * _name;
}
//set方法
-(void)setName:(NSString*)name{
_name=name;
}
-(void)setGid:(int)gid{
_gid=gid;
}
//get方法
-(NSString*)name{
return _name;
}
-(int)gid{
return _gid;
}
@end
复制代码
/*非规范代码,请勿模仿*/
然后我意识到错误的时候发现,xcode的预编译竟然没有报错!会不会这么写也可以?于是我做了一次尝试。我在头文件的@interface中仅申明了对象方法,代码如下:
#import <Foundation/Foundation.h>
@interface Goods : NSObject
-(void)setName:(NSString*)name;
-(void)setGid:(int)gid;
-(NSString*)name;
-(int)gid;
@end
复制代码
然后在main函数里尝试通过调用set和get方法,看看是否可以对我在@implementation中申明的实例变量进行,也就是说我想看看我定义在@implementation里的东西是不是能和定义在@interface里定义的一样有效果。于是我写了如下代码:
#import <Foundation/Foundation.h>
#import "Goods.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
Goods * test=[Goods new]; //创建对象
[test setName:@"goods1"];
[test setGid:100];
NSLog(@"%@",[test name]);
NSLog(@"%d",[test gid]);
}
return 0;
}
复制代码
编译运行没有报错,同时输出也是预想的结果:
スクリーンショット 2015-11-07 21.21.46.png
(70.86 KB, 下载次数: 21)
下载附件
2015-11-7 21:22 上传
所以我在@implementation里定义的实例变量是确实发挥着作用的。
这虽然是一种不规范的代码格式,但由此却提出一个问题,@interface和@implementation的作用与界限究竟是什么。等待各位大神来解决我的疑惑。
作者:
Morning_jcg
时间:
2015-11-7 21:32
又抽风,,修改完毕。
作者:
Morning_jcg
时间:
2015-11-8 11:19
没有大神评论回答么?自顶一发,,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2