刚刚进行多文件练习的时候发生了一个有意思的“意外”。
/*非规范代码,请勿模仿*/
然后我意识到错误的时候发现,xcode的预编译竟然没有报错!会不会这么写也可以?于是我做了一次尝试。我在头文件的@interface中仅申明了对象方法,代码如下:
我用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;
}
编译运行没有报错,同时输出也是预想的结果:
所以我在@implementation里定义的实例变量是确实发挥着作用的。
这虽然是一种不规范的代码格式,但由此却提出一个问题,@interface和@implementation的作用与界限究竟是什么。看来还需要更深刻的理解和学习。