C语言如何为结构体中的某个属性赋值

C语言如何为结构体中的某个属性赋值,第1张

C语言中,数组间不能相互赋值——这是历史遗留问题,当年在B语言中,数组名和指针名是没有区别的(除了数组名定义时自动为数组分配内存),数组名可以指向别的对象或数组。换句话说,数组名之间的赋值是浅赋值。后来C语言的设计者发现这种规则在C语言行不通,但是C语言的设计者又不想破坏对B语言的兼容性,于是就干脆禁止了数组间的赋值(这样B语言程序员在C语言中尝试“数组间浅赋值”的时候就会得到明确的报错)。后来B语言退出历史舞台,而C语言的这种设计却一直保留下来,遗臭万年……

字符数组间的赋值需要用

strcpy

或(如果知道数组长度)

memcpy。在这个例子中strcpy(s1.ch,"this")是标准做法。不用担心性能损失,现代编译器都把

strcpy

作为内置过程,可以保证和汇编一样高效(甚至更高效)

1、分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以<原则上讲它只能添加方法, 不能添加属性(成员变量),实际上可以通过其它方式添加属性>

为什么在分类中声明属性时,运行不会出错呢?

既然分类不让添加属性,那为什么我写了@property仍然还以编译通过呢?

我们知道在一个类中用@property声明属性,编译器会自动帮我们生成_成员变量和setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成_成员变量也无法生成setter/getter。

因此结论是:我们可以用@property声明属性,编译和运行都会通过,只要不使用程序也不会崩溃。但如果调用了_成员变量和setter/getter方法,报错就 在所难免 了。

既然报错的根本原因是使用了系统没有生成的setter/getter方法,可不可以在手动添加setter/getter来避免崩溃,完成调用呢?

其实是可以的。由于OC是动态语言,方法真正的实现是通过runtime完成的,虽然系统不给我们生成setter/getter,但我们可以通过runtime手动添加setter/getter方法。那具体怎么实现呢?

按照这个思路,我们通过运行时手动添加这个方法。

#import <objc/runtime.h>

static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey"  //定义一个key值

@implementation Programmer (Category)

//运行时实现setter方法

- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {

        objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY)

}

//运行时实现getter方法

- (NSString *)nameWithSetterGetter {

    return objc_getAssociatedObject(self, &nameWithSetterGetterKey)

}

@end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11722430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存