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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangenhao 中级黑马   /  2014-5-9 11:38  /  1774 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jiangenhao 于 2014-5-10 16:38 编辑

主函数如下
  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3. int main(int argc, const char * argv[])
  4. {

  5.     Person *p = [Person new];
  6.     id d =[Person new];
  7.     [d setAge:10];
  8.   //  NSObject *o = [Person new];
  9.    
  10.   //  id  ==  NSObject *
  11.     NSLog(@"%d",[d age]);
  12.    
  13.     return 0;
  14. }
复制代码

.h文件如下:
  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject

  3. @property int age;

  4. @end
复制代码

.m文件如下:
  1. #import "Person.h"

  2. @implementation Person

  3. @end
复制代码


问题:property只是对getAge和age方法做了声明,并没有实现,为什么我在主函数中可以调用getAge和age方法?

8 个回复

正序浏览
楼上正解,刚看到快速入门视频里有
回复 使用道具 举报
synthesize 是X code5.0 以前的。 X code5.0后苹果公司把synthesize的功能合并到了property 里面,
所以当你 用property的时候, 声明实现是一起来!

回复 使用道具 举报
我还是没明白
声明是property做的事
实现get set方法是synthesize做的事
我没有写synthesize 为什么会有get set方法?
回复 使用道具 举报
Xcode 自己会的
回复 使用道具 举报
有一个东东叫做编译器
就拿C语言来说,我们写的一些代码都是有着编码格式的文本文件。可程序最终被操作系统运行,操作系统只认识二进制的0和1,所以从我们编写的代码文件到生成机器可以运行的可执行文件之间需要一层包装转换,这就是编译器干的事情
编译器本身也是一个可执行项目,它里面会对你写的代码进行语法检查,更重要的是它内部定义了一些特性,当你的代码符合它定义的特性的时候就会进行一些替换和自动生成的工作。@property就是Xcode里面定义的一个特性,当Xcode编译器看到这个家伙的时候,会自动生成关于这个属性的getter和setter方法,其实也只是很刻板的自动增加一个_属性名称的这么一个私有变量
编译器做完这一切就会将这份自动生成的新代码就行编译,编译成二进制格式的目标文件,然后做一步链接操作,所有的目标文件和调用系统的一些个框架文件链接在一起才能生成最终的可执行文件
在.net里,编译器也提供了很多语法特定,极大的简化了程序员的编码量。.net平台是托管的,所以使用的C#语言需要先被编译成中间代码,这些代码可以使用reflector这类反编译工具看的清清楚楚
回复 使用道具 举报
我什么方法都没有实现 我的get set方法从哪里来的呢
回复 使用道具 举报
老师的视频里说了,编译器特性:
若只手动实现了setter,编译器会自动生成getter和不存在的成员变量;
若只手动实现了getter,编译器会自动生成setter和不存在的成员变量;
若同时实现了setter和getter,编译器就不会自动生成不存在的成员变量。
回复 使用道具 举报
后边的版本就是这样的,自动生成代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马