本帖最后由 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;
- }
复制代码 编译运行没有报错,同时输出也是预想的结果:
所以我在@implementation里定义的实例变量是确实发挥着作用的。
这虽然是一种不规范的代码格式,但由此却提出一个问题,@interface和@implementation的作用与界限究竟是什么。等待各位大神来解决我的疑惑。
|
|