OC学习笔记(五)--对象与函数

#import <Foundation/Foundation.h>  
  
@interface Person : NSObject  
{  
      float weight;  
      int age;  
}  
  
- (void) talk;  
       
@end  
  
@implementation Person  
- (void) talk  
{  
      NSLog(@"对方(年龄%d体重%f)不想跟你说话,并向你扔了一个Hello world。。",age,weight);
}
@end  

例一:

void test(int a,float w)
{
      a = 2;
      w = 8.0;
}

<pre name="code" class="objc">int main()
{
      Person *p = [Person new];
      p->age = 30;
      p->weight = 60.0;
      test(p->age,p->weight);
      [p talk];
      return 0;
}

 
 

运行结果:对方(年龄30体重60.0)不想跟你说话,并向你扔了一个Hello world。。

原因:由于test中值传递,改变的是a和w的值,并没有改变对象中的属性值;


例二:

void test1(Person *p)
{
      p->weight = 50.0;
}


int main()
{
      Person *p = [Person new];
      p->age = 30;
      p->weight = 60.0;
     // test(p->age,p->weight);
      test1(p);
      [p talk];
      return 0;
}

运行结果:对方(年龄30体重50.0)不想跟你说话,并向你扔了一个Hello world。。

原因:test1中参数p已经指向main中定义的p,所以修改有效;

例三:

void test2(Person *ps)
{
      Person *per = [Person new];
      per->age = 70;
      per->weight = 40.0;
      ps = per;
      ps->weight = 48.5;
}


int main()
{
      Person *p = [Person new];
      p->age = 30;
      p->weight = 60.0;
     // test(p->age,p->weight);
     // test1(p);
      test2(p);
      [p talk];
      return 0;
}

运行结果:对方(年龄30体重60.0)不想跟你说话,并向你扔了一个Hello world。。

原因:由于test2函数中指针ps已经指向了per的值,已经与main中的p对象无关,所以修改无效;

总结:只要搞清楚指针的指向,一切就容易了,指向谁就找谁;必要的时候可以自己在草稿纸上画一个内存指向图,一目了然;

另外,注意一个问题:在OC中,对象是不会自动回收的,需要手动释放,所以只要申请了一个对象,都会留在内存中,等着你释放,后续将会继续学习有关OC中内存管理的知识。


你可能感兴趣的:(函数,对象,oc)