objective-c - 为什么这一段Objectc会报错?

 云匢天仙草 发布于 2022-10-26 11:11


#import 


@interface Person :NSObject
{
    int age;
    NSString * name;
}
-(void)setAge:(int)age;
-(void)  sayHi;
@end

@implementation Person

-(void)setAge:(int)age{
    
    
    self.age=age;
}
-(void)sayHi{
    NSLog(@"im  jerry %d",age);
}


@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        Person* p=[Person new];
       
        [p setAge:5];
        
        [p sayHi];
    }
    return 0;
}

self.age=age;这里报错了。
在java里面,不是this.age=age吗?oc里面难道不行吗?

4 个回答
  • 写在这里@interface可以直接用不用加self.
    直接age = age就行

    2022-10-27 00:57 回答
  • 这里不要用点语法,然后就是你的成员变量前都统一加上下划线来区分。 _age = age;

    2022-10-27 00:57 回答
  • 详细解释如楼上所述,简而言之:
    OC中的点语法,只是一种编译器特性,本质仍然是方法调用。

    2022-10-27 00:58 回答
  • 在objective-c里面,属性虽然调用的时候像是一个简单的赋值、取值操作,但是实际上它属性的使用是方法的调用!

    如:

    @property(copy) NSMutableArray *array;
    这个属性添加以后,用起来好像是一个变量,其实编译器做的不仅仅是添加了一个变量:

    1. 添加了一个类全局变量NSMutableArray * _array

    2. 添加了Get方法-(NSMutableArray *)array;

    3. 添加了Set方法-(void)setArray:(NSMutableArray *)array;

    你的代码中虽然没有使用@property,指定属性,但是缺命名了一个符合属性的set方法的方法名,因此,使用时一样可以使用点语法

    A

    self.age=age;

    B

    [self setAge:age];

    A、B两者是等效的!编译后,A会被转化成B的形式,而B会进一步转化成C函数调用的形式!

    你在-setAge:方法里面调用-setAge:,导致无限递归。如果你有注意到崩溃时程序的栈,会发现栈里面都是-setAge:

    想要避免这个问题,就直接使用类变量赋值

    _age = age;
    2022-10-27 00:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有