`

Objective-C属性赋值过程

 
阅读更多

先写一个简单的自定义类

@interface PGYer : NSObject

 

@property(copy) NSString * uKey;

覆写init方法,为了方便起见我们把今天要说的东西放在init中

#import "PGYer.h"

#import <objc/runtime.h>

@implementation PGYer

    @synthesize uKey = _uKey//此处是关键

-(instancetype)init{

    NSLog(@"%@",NSStringFromClass([super class]));

    if (self = [super init]) {

        NSLog(@"%@",NSStringFromClass([self class]));

        NSLog(@"%@",NSStringFromClass([super class]));

        Ivar ivar =        class_getInstanceVariable([self class], "uKey");

        object_setIvar(self, ivar, @"1234546");

        id uKey = object_getIvar(self, ivar);

        NSLog(@"%@",uKey);

    }

    return self;

}

 

@end

我们来看一下打印信息


我们看到最下边打印为空。

那么我们来分析一下流程:

1通过class和属性名称获取c语言类型的属性变量Ivar

2.调object_setIvar给C类型的变量赋值

3调用object_getIvar从C类型的变量中获取属性值

整个流程看似完全没有问题

但是 我们忽视了一个问题

 

    @synthesize uKey = _uKey//此处是关键

默认是这样绑定,因此,此时的属性名称的C写法是:_uKey

我么修改一下代码:

 

  Ivar ivar =        class_getInstanceVariable([self class], "_uKey");

然后我们看一些截图数据



 由截图可以看出,系统默认把

@property(copy) NSString * uKey;转化为内部的_uKey

那么我们再次修改一下代码

再内部添加一个_uName属性

@interface PGYer : NSObject

{

    NSString *_uKey;

    NSString *_uName;

}

@property(copy) NSString * uKey;

 

@end我们再次通过Ivar进行赋值

  Ivar nameVar = class_getInstanceVariable([self class], "_uName");

        object_setIvar(self, nameVar, @"YuLongLe");

        id aName = object_getIvar(self, nameVar);

 

        NSLog(@"name %@",aName);

最后我们看一下debug模式下的情况:


我们可以看出成功的给_uName进行了赋值。

 

其实Xcode在之前的旧时代是

@propert和@synthesize是成对出现的,只是随着更新的加快,开发者已经无需手动添加synthesize,而是由编译器自动给添加了“_”,当然了,用户也可手动修改

 

  • 大小: 98.8 KB
  • 大小: 55.5 KB
  • 大小: 32.7 KB
  • 大小: 51.8 KB
  • 大小: 69.2 KB
分享到:
评论

相关推荐

    Objective-C Fundamentals

    Objective-C作为苹果公司为iOS和Mac OS开发的主要编程语言,在学习iOS开发的过程中扮演着关键角色。 首先,Objective-C是一种面向对象的编程语言,继承了Smalltalk的类和消息传递机制,并在C语言的基础上扩展而来。...

    The Objective-C Programming Language

    Objective-C是一种通用、面向对象的编程语言,它是在C语言的基础上扩展而成的。Objective-C是苹果公司在开发macOS和iOS应用时的主要语言之一,尤其是在iOS开发初期。该语言的设计哲学强调了消息传递和动态类型。...

    Objective-C Cheatsheet

    这个速查表涵盖了Objective-C编程的基本元素,使得开发人员在编码过程中能够快速找到他们需要的信息。 在描述中提到,做Objective-C开发时很有用,这说明了这份速查表对于学习和使用Objective-C的开发者来说是一个...

    Objective-C 速查手册 1.2 (ARC版)

    综上所述,Objective-C通过强大的面向对象特性和自动引用计数机制,简化了iOS和macOS应用的开发过程,提高了代码的可读性和维护性。掌握其基本语法和特性,是成为一名合格的苹果平台开发者的基础。

    Objective-C培训资料

    Objective-C不仅继承了C语言的基础特性,还引入了许多面向对象的概念和技术,如类、对象、继承等。 #### 二、程序结构与基础语法 Objective-C程序通常由头文件(.h)和源文件(.m)组成。头文件包含接口声明,而...

    Objective-c 学习 (2).doc

    在Objective-C的学习过程中,理解并熟练掌握`property`的用法至关重要。 `property`的声明语法如下: ```objc @property (参数1, 参数2) 类型 名字; ``` 主要参数包括: 1. **读写属性(readwrite/readonly)**...

    Objective-C显示变量的值一

    在Objective-C编程中,变量是存储数据的基本容器。在这个场景中,我们讨论的是如何将两个数字相加并将结果存储在一个变量中,然后显示这个变量的值。Objective-C是一门强大的面向对象的语言,常用于开发Apple的iOS和...

    ARC探秘:Objective-C中的自动引用计数革命

    ### ARC探秘:Objective-C中的自动引用计数革命 #### 1. ARC简介 自动引用计数(Automatic Reference Counting,简称 ARC)是一项由Apple公司为Objective-C编程语言设计的内存管理技术。ARC的主要目标是简化内存...

    以实例讲解Objective-C中的KVO与KVC机制

    1. **setValue:forKey:**:用于给对象的属性赋值,键(Key)对应属性名,值(Value)是要赋给该属性的新值。 2. **valueForKey:**:用于获取对象属性的值,通过键(Key)找到对应的属性并返回其值。 例如,如果有一...

    iOS 获取手机的本地音乐

    你可能需要将这些歌曲信息显示在一个表格视图或者集合视图中,此时,可以将查询结果赋值给数据源,然后在cell中显示相关属性。 8. **调试**: 为了调试,你可以创建一个简单的UI按钮,点击后执行上述操作,以便在...

    100家企业iOS面试题(下)

    - **不同之处**:C语言是一种过程式编程语言,而Objective-C是一种面向对象的扩展版C语言,支持类和对象的概念。 - **面向对象编程**:Objective-C支持类、实例化对象、继承等面向对象编程特性。 #### 题目98:...

    2018iOS一份高级面试题

    1. **面向对象**:Objective-C 支持面向对象编程,而 C 语言是一种过程化编程语言。 2. **动态消息传递**:Objective-C 通过动态消息传递机制实现方法调用。 3. **内存管理**:Objective-C 提供了 ARC 来简化内存...

    OC底层原理之OC语法课件ppt

    - **KVC赋值与取值过程**: - 赋值:调用`setValue:forKey:`方法。 - 取值:调用`valueForKey:`方法。 - 原理:`KVC`通过反射机制找到对应的方法来完成赋值或取值。 - **KVC与KVO的关系**: - 通过`KVC`修改属性...

    iphone 开发学习基础char

    在这个过程中,需要注意的是,`UTF8String`返回的是遵循UTF-8编码的C风格字符串,确保了与C语言的兼容性。 在实际开发中,了解如何在Objective-C中处理字符和字符串是非常重要的。在压缩包`Classes`中,可能包含了...

Global site tag (gtag.js) - Google Analytics