先写一个简单的自定义类
@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,而是由编译器自动给添加了“_”,当然了,用户也可手动修改
相关推荐
Objective-C作为苹果公司为iOS和Mac OS开发的主要编程语言,在学习iOS开发的过程中扮演着关键角色。 首先,Objective-C是一种面向对象的编程语言,继承了Smalltalk的类和消息传递机制,并在C语言的基础上扩展而来。...
Objective-C是一种通用、面向对象的编程语言,它是在C语言的基础上扩展而成的。Objective-C是苹果公司在开发macOS和iOS应用时的主要语言之一,尤其是在iOS开发初期。该语言的设计哲学强调了消息传递和动态类型。...
这个速查表涵盖了Objective-C编程的基本元素,使得开发人员在编码过程中能够快速找到他们需要的信息。 在描述中提到,做Objective-C开发时很有用,这说明了这份速查表对于学习和使用Objective-C的开发者来说是一个...
综上所述,Objective-C通过强大的面向对象特性和自动引用计数机制,简化了iOS和macOS应用的开发过程,提高了代码的可读性和维护性。掌握其基本语法和特性,是成为一名合格的苹果平台开发者的基础。
Objective-C不仅继承了C语言的基础特性,还引入了许多面向对象的概念和技术,如类、对象、继承等。 #### 二、程序结构与基础语法 Objective-C程序通常由头文件(.h)和源文件(.m)组成。头文件包含接口声明,而...
在Objective-C的学习过程中,理解并熟练掌握`property`的用法至关重要。 `property`的声明语法如下: ```objc @property (参数1, 参数2) 类型 名字; ``` 主要参数包括: 1. **读写属性(readwrite/readonly)**...
在Objective-C编程中,变量是存储数据的基本容器。在这个场景中,我们讨论的是如何将两个数字相加并将结果存储在一个变量中,然后显示这个变量的值。Objective-C是一门强大的面向对象的语言,常用于开发Apple的iOS和...
### ARC探秘:Objective-C中的自动引用计数革命 #### 1. ARC简介 自动引用计数(Automatic Reference Counting,简称 ARC)是一项由Apple公司为Objective-C编程语言设计的内存管理技术。ARC的主要目标是简化内存...
1. **setValue:forKey:**:用于给对象的属性赋值,键(Key)对应属性名,值(Value)是要赋给该属性的新值。 2. **valueForKey:**:用于获取对象属性的值,通过键(Key)找到对应的属性并返回其值。 例如,如果有一...
你可能需要将这些歌曲信息显示在一个表格视图或者集合视图中,此时,可以将查询结果赋值给数据源,然后在cell中显示相关属性。 8. **调试**: 为了调试,你可以创建一个简单的UI按钮,点击后执行上述操作,以便在...
- **不同之处**:C语言是一种过程式编程语言,而Objective-C是一种面向对象的扩展版C语言,支持类和对象的概念。 - **面向对象编程**:Objective-C支持类、实例化对象、继承等面向对象编程特性。 #### 题目98:...
1. **面向对象**:Objective-C 支持面向对象编程,而 C 语言是一种过程化编程语言。 2. **动态消息传递**:Objective-C 通过动态消息传递机制实现方法调用。 3. **内存管理**:Objective-C 提供了 ARC 来简化内存...
- **KVC赋值与取值过程**: - 赋值:调用`setValue:forKey:`方法。 - 取值:调用`valueForKey:`方法。 - 原理:`KVC`通过反射机制找到对应的方法来完成赋值或取值。 - **KVC与KVO的关系**: - 通过`KVC`修改属性...
在这个过程中,需要注意的是,`UTF8String`返回的是遵循UTF-8编码的C风格字符串,确保了与C语言的兼容性。 在实际开发中,了解如何在Objective-C中处理字符和字符串是非常重要的。在压缩包`Classes`中,可能包含了...