美文网首页
OC中几种定义类属性的区别(包括在分类中的实现)

OC中几种定义类属性的区别(包括在分类中的实现)

作者: 你duck不必呀 | 来源:发表于2019-03-27 13:30 被阅读0次

第一种,直接写@interface...@end在大括号里面

在.h文件

@interface testClass :NSObject
{
/*默认是protected,要在外界访问需要加public修饰*/
    @public
    NSInteger age;
    NSString *name;
}
@end

在外界调用:

{
testClass *test=[testClass new];
/*调用和C语言的结构体类似(如下),不能用点语法*/
test->age=18;//或(*test).age=18;
test->name=@"苍老师";//或(*test).name=@"苍老师";
NSLog(@"%@,%@",test->age,test->name);
}

在本类调用

{
/*调用和C语言的结构体类似(如下),不能用点语法,self代表当前类对象(testClass *)*/
self->age=18;
self->name=@"苍老师";
//或
(*self).age=18;
 (*self).name=@"苍老师";
NSLog(@"%@,%@",test->age,test->name);
}

在.m文件

@interface testClass()
/*默认是private,无法修改*/
    @public//无效
    NSInteger age;
    NSString *name;
@end

在外界不能访问,本类和在.h文件一样

{
/*调用和C语言的结构体类似(如下),不能用点语法,self代表当前类对象(testClass *)*/
self->age=18;
self->name=@"苍老师";
//或
(*self).age=18;
 (*self).name=@"苍老师";
NSLog(@"%@,%@",test->age,test->name);
}

第二种 通过@property定义

在.h文件

@interface testClass :NSObject
/*默认是private*/
@property NSInteger age;
@property NSString *name;
@end

在外界访问

{
/*只能用.语法*/
testClass *test=[testClass new];
test.age=18;
test.name=@"苍老师";
}

在本类访问

{
self.age=18;//或 _age=18
 NSLog(@"%@",self.age);
}

@property关键字在此处做了以下事情

  1. 在.h文件里面用大括号创建了带_前缀的同名变量,默认private修饰
    2.在.h文件声明对应的getter和setter方法,并在.m文件实现

验证一下

/*在.h文件中只用@property 定义属性*/
@interface testClass :NSObject
/*默认是private*/
@property NSInteger age;
@property NSString *name;
@end

在外界能通过.语法访问

testClass *test=[testClass new];
test.age=18;

因为在.h文件的属性能在外界访问,

在本类

{
    self.age;
    self.name;
    self->_age;
    self->_name;
    (*self)._age;
    (*self)._name;
}

所以有带_的同名变量在.h文件

在类别中也可以添加属性,在.h文件

@interface testClass (sex)
@property (nonatomic, strong) NSString *sex;
@end

在.m中手动实现get,set,在用到_sex时,编译器均提示未定义的成员属性。

@implementation testClass (sex)

- (void)setSex:(NSString *)sex{
    _sex=sex;//Use of undeclared identifier '_sex'; did you mean 'sex'?
    
}

- (NSString *)sex{
    
    return _sex;//Use of undeclared identifier '_sex'
}

所以添加的sex属性,没有生成_sex成员变量,没有get和set方法

 testClass *test=[[testClass alloc]init];
        test.name=@"高松惠理";
        test.age=@"26";
        test.sex=@"女";//xcode能提示
        
        NSLog(@"name=%@,age=%@,sex=%@",test.name,test.age,test.sex);

xcode能提示,但是一运行会出错,没有set,get方法
要用的话,可以通过运行时实现

#import "testClass+sex.h"
#import <objc/runtime.h>

@implementation testClass (sex)

- (void)setSex:(NSString *)sex{
    objc_setAssociatedObject(self, @"sex", sex, OBJC_ASSOCIATION_COPY_NONATOMIC);
    
}

- (NSString *)sex{
    
  return objc_getAssociatedObject(self, @"sex");
    
}
@end

最后运行结果
name=高松惠理,age=26,sex=女

相关文章

  • OC中几种定义类属性的区别(包括在分类中的实现)

    第一种,直接写@interface...@end在大括号里面 在.h文件 在外界调用: 在本类调用 在.m文件 在...

  • Swift— 便利构造器 (extension)

    * extension相当于OC中的分类, 特点和OC中的分类一样 * 不能定义存储属性 * 如果想给系统的类新增...

  • Category关联对象

    OC中的分类严格来说,是不能添加对象;但是我们可以通过OC运行是的机制,动态为分类添加属性 一、类中的属性 当在类...

  • iOS底层原理 07 : Runtime底层的相关面试题

    1.OC类中成员变量,属性,实例变量的区别? 成员变量成员变量是定义在{}号中的变量。(yourButton、co...

  • OC中分类的实现原理

    OC中为类添加一个分类(Category)可以实现为类添加对象方法、类方法、添加属性(添加的属性不生成成员变量)、...

  • 213类的定义及对象的使用

    1、类的定义规范 在类的设计中,可以只包括字段、属性或方法 例:类的定义 新建一个项目,并添加类,在类中定义属性、...

  • OC属性关联的实现原理

    OC中在分类中添加属性用属性关联技术来实现存取值的: 那么系统的属性关联功能是如何实现的呢? 属性关联怎么存储对象...

  • 分类-Category

    分类-Category 分类的功能 在OC中,我们可以使用分类为类添加方法,属性.也可以覆盖类原有的方法,自己添加...

  • 分类-Category

    分类-Category 分类的功能 在OC中,我们可以使用分类为类添加方法,属性.也可以覆盖类原有的方法,自己添加...

  • 属性

    存储属性其实Swift中的存储属性就是以前学习OC中的普通属性, 在结构体或者类中定义的属性, 默认就是存储属性*...

网友评论

      本文标题:OC中几种定义类属性的区别(包括在分类中的实现)

      本文链接:https://www.haomeiwen.com/subject/inunvqtx.html