首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OC - 属性关键字和所有权修饰符

1.3 内存管理 属性关键字 用法 assign 1.setter 方法实现是直接赋值,一般用于基本数据类型 。...2.修饰基本数据类型,如 NSInteger、BOOL、int、float 等;3.修饰对象类型时,增加其引用计数;4.会产生悬垂指针(悬垂指针:assign 修饰对象在被释放之后,指针仍然指向原对象地址...这时候如果继续通过指针访问原对象的话,会由于悬垂指针原因产生内存泄漏或程序异常)。 weak 1.ARC 下才能使用。2.修饰弱引用,增加对象引用计数,主要可以用于避免循环引用。...例如,指定一个指向nullable对象nonnull指针,可以使用_Nullable id * _Nonnull; 特殊类型NSError **经常用于通过方法参数返回错误,因此始终假定它是指向nullable...答:编译器会自动生成互斥锁,对 setter 和 getter 方法进行加锁,可以保证属性赋值和取值原子性操作是线程安全,但不包括操作和访问。

1.3K31

《Effective C++》读书摘要

十、operator=返回*this引用 允许连续赋值。 十一、operator=处理自我赋值 注意资源释放顺序。 十二、复制对象要面面俱到 不要丢失基类成员复制。...二十八、避免返回对象内部数据引用或指针 破坏了封装型; 函数返回对象析构导致空指针。 二十九、异常安全努力 ? 对象管理资源; copy-swap实现技术; 异常安全性取决于最弱安全保证代码。...四十五、运用成员函数模板接受兼容类型 成员函数使用函数模板兼容更多类型; 函数模板声明后copy构造和编译器生成并不同,需要单独处理。...可以根据iterator_traits提供类别标签区分迭代器类型,类别标签是空结构体类型,将标签作为函数参数,可以保证编译器能在编译时期对类型进行检查。 ?...现在就可以把doAdvance封装起来自动完成编译类型判断。 四十八、模板元编程 让某些事情变得容易可能,将某些工作从运行期转移到编译期; 分支——借由模板特化实现; 循环——借由递归完成; ?

1.9K60
您找到你想要的搜索结果了吗?
是的
没有找到

Whats New in LLVM 9

API 不会被编译器告警,所以不用担心旧项目中已有的代码会产生一大片 warning,只需在采用新 API 时候加上 [@available](https://github.com/available...但总有奇葩把 onceToken 声明成成员变量,使得指针地址可能会重复,无法保证线程安全地只执行一次。而现在 LLVM 可以检查出这种规范使用方式。...可以在编译设置中将 warning 升级成 error。如果是旧工程,需要升级工程文件到 Xcode 9,然后才能看到这些新增 warning 设置项。...无参数函数声明 如果函数没有参数,需要用 void 显式声明。否则可能调用方会传入其他类型和数量参数,在运行时引发 crash。如果用 void 显式声明,在编译阶段就会产生 error。...就像 OC 中字符串和数组传递赋值时一般都 copy,string_view 相当于是 assign,搞不好野指针呢。 详见 string_view。

2.4K100

【编程基础】C语言指针初始化和赋值

所以如果写出int *p = 0x12345678 ; 这条语句编译器会报错:'=' : cannot convert from ' const int ' to ' int * ' ,因为赋值操作符左边和右边表达式类型应该相同...也就是说,我们可以将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个任何类型指针,此后这个指针就成为一个空指针,由系统保证空指针指向任何对象或函数。...,如:char *cp = “abcdefg”; 对指针进行初始化或赋值实质是将一个地址或同类型(或相兼容类型)指针赋给它,而不管这个地址是怎么取得。...C语言中malloc函数返回值就是一个void *型指针,我们可以把它直接赋给一个其他类型指针,但从安全编程风格角度以及兼容性上讲,最好还是将返回指针强制转换为所需类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为...文章来自CSDN:mhjcumt专栏

2.6K80

C语言边角料:结构体中指针类型成员变量,它类型重要吗?

一、前言 二、问题描述 三、把类型改为 void 指针类型 四、总结 一、前言 昨天在编译代码时候,之前一直OK一个地方,却突然出现了好几个 Warning!...那么我们就按照 gcc 方式来理解一下。 我们知道,编译器在遇到一个结构体类型时候,最重要就是需要知道结构体类型 所占据内存空间大小。...然后 gcc 在解析 Data2 d2 = {2, &d1}; 这一行时,就发现 类型匹配了:data2 next 需要是 struct _Data3_ 类型指针,但是赋值 d1 是 struct...然后把这个地址赋值给dn 指针,那么通过dn指针来操作该地址内成员时,就取决于在定义dn时所指定数据类型(Data1),因此 dn->a 就可以正确从这个地址中取出前 4 个字节,然后作为一个int...不过,从中我们也看到了一个现象:gcc编译器在面对结构体时,主要关心是结构体在内存空间中所占用空间大小,对其内部指向结构体类型指针,并没有严格检查是否存在,g++ 在这一点就做严谨一些了。

52340

Golang 面试题

---- 1. make与new区别 Make 用于map、slice 和channel几种类型内存分配。并且返回一个有初始值对象,注意不是指针。...注:channel在make之后打印出来也是内存地址,是个特殊类型。 New 用于使用type声明类型内存分配。new(T)分配了零值填充T类型内存空间,并且返回其地址,即一个T类型值。...用Go术语说,它返回了一个指针,指向新分配类型T零值。有一点非常重要:new返回指针。 2....init,但是无论是从可读性还是可维护性来说,都是推荐; 其次,这两个函数定义时都不能有任何参数和返回值, 最后,个人理解,init函数为初始化操作,main函数为程序入口。...答案:是9, len方法返回字符串字节长度。 11、这段代码可以编译过吗,如果会错是在哪一行?

52020

指向函数指针

函数指针变量定义一般形式如下: 类型说明符(*指针变量名)(函数形参列表); 说明: (1)函数指针变量可以指向函数满足两个条件:函数返回值由上面“类型说明符”确定;函数形参列表与上面...实际上函数指针变量定义时,形参名字对编译没有意义,习惯上省略写。...例如: pl=func; 赋值符右边是一个函数名,且该函数定义时返回类型是int,有两个int类型形参。...(3)通过函数指针变量调用函数一般形式如下: (*函数指针变量)(实参列表); 通过函数指针变量调用函数效果与使用函数名调用函数执行流程是一样,实参与形参同样要求个数相同,类型符合赋值兼容规则...例如 int c=(*p1)(100,10); 上面语句调用指针p1指向函数,实参为100和10,返回赋值给变量c。

78910

clang_intprt_t类型探究

return 0; } 只看op == LC这段代码,ax是一个int类型,存放值是char *指针类型地址,取完该地址所在值再赋给变量ax 但是如此写代码,vimyoucomplete插件一直报错...当然-m32这种参数,就不讨论了 初步结论 g++编译时候就认为是个错误,gcc32位编译可以正常运行,64位运行时报错 我们探讨一下原因,32位和64int类型都是4个字节,但是指针类型大小不一致...从138行开始看,对应着代码int a = 1,将数字1赋值给rbp栈上-0x10处,也就是在距离bp栈16字节处(因为0x10=16);如下图1行,B(地址)处为数字1,占四个字节,那么中间竖线就是...也就是B,赋值给rax低位,本来这个rax低位8个字节就是B,这个没问题,问题出在64位系统给eax(rax低位)赋值,会影响rax高位,高位全被置为0了....eax表达出来是负数,rax高位补出来是全f;同理eax正数情况下,rax高位补全才是0 解决方案 在c99标准库里面有一个结构体,intptr_t可以实现编译器位数兼容性 //头文件stdint.h

1K100

【C++干货基地】六大默认成员函数: This指针 | 构造函数 | 析构函数

其实在C++这里虽然我们没有给print 函数参数,但实际上是有一个默认this 指针来自动调用,实际代码可能是下面这样但是编译器给自动化了大大简化了用户操作。...只不过所有的操作对用户是透明,即用户不需要来传递,编译器自动完成。 1.2 this 指针特性 this指针类型:类类型 const,即成员函数中,不能给this指针赋值。...无返回值。 对象实例化时编译器自动调用对应构造函数。 构造函数可以重载。...// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明 // 以下代码函数:声明了d3函数,该函数无参,返回一个日期类型对象 // warning...但是这个构造函数对,内置类型处理,对自定义类型调用它默认函数 比如说这里我们就没有去显示创建构造函数,但是自动创建了一个默认构造函数,默认构造函数 对自定义类型调用他构造函数 对内置类型不做处理

6500

【C++航海王:追寻罗杰编程之路】C++类型转换

1 -> C语言中类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回类型与接收返回类型不一致时,就需要发生类型转换,C语言中总共有两种形式类型转换: 隐式类型转换...:编译器在编译阶段自动进行,能转就转,不能转就编译失败。...因此C++提出了自己类型转换风格,注意:因为C++要兼容C语言,所以C++中还可以使用C语言转换风格。...3.1 -> static_cast static_cast用于非多态类型转换(静态转换),编译器隐式执行任何类型转换都可用static_cast,但它不能用于两个不相关类型进行转换。.../引用转换为子类对象指针/引用(动态转换) 向上转型:子类对象指针/引用 -> 父类指针/引用(不需要转换,赋值兼容规则)。

10010

C++中类型转换

explicit 三、常见面试题 零、前言 本章主要学习C++四种类型转换 一、C语言类型转换 概念及介绍: 在C语言中,如赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回类型与接收返回类型不一致时...,就需要发生类型转化 C语言中两种形式类型转换: 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 示例: void Test () {...显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言转化风格 二、C++强制类型转换 标准C...// 所以非常BUG,下面转换函数指针代码是不可移植,所以建议这样用 // C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定结果 // FUNC.../引用转换为子类对象指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全

1.9K20

C++类型转换

目录 1.C语言中类型转换 2.C++为什么需要四种类型转换 3.C++强制类型转换 4.问答 ---- 1.C语言中类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型匹配,...或者返回类型与接收返回类型不一致时,就需要发生类型转化,C语言中总共有两种形式类型转换:隐式类型转换和显式类型转换。...①隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 ②显式类型转化:需要用户自己处理 int main() { int i = 1; //隐式类型转换 double d =...C++觉得它不够好,自己在C语言基础上,重新搞了一下C++自己四种类型转换。需要注意是因为C++要兼容C语言,所以C++中还可以使用C语言转化风格。...向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全) 如果直接转换的话是不安全

85630

Debug和Release之本质区别

(即编译assert函数)  /GF 合并重复字符串,并将字符串常量放到只读内存,防止被修改      实际上,Debug 和 Release 并没有本质界限,他们只是一组编译选项集合,编译器只是按照预定选项行动...帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中。...C++ 类型特性能检查出大多数这样错误,但如果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。...要特别注意是,很多人认为编译器会用 0 来初始化变量,这是错误(而且这样很不利于查找错误)。 2.  通过函数指针调用函数时,会通过检查栈指针验证函数调用匹配性。(防止原形匹配) 3.  ...函数返回前检查栈指针,确认未被修改。

3.7K90

【C语言】const 关键字

间接赋值 说明⇢在 const 修饰变量不可以直接被修改,但是可以通过指针方式进行间接修改。...int* p同一类型整形指针类型,不然编译器会发生warning(警告) Why cosnt 修饰⇢其实很简单就是我这个程序员不想修改这个变量,一旦我不小心进行了修改的话编译器会告诉我修改了这个变量...㈤[const]修饰函数参数 在const修饰符也可以修饰函数当中参数,当希望这个参数值在函数体内被意外修改时候进行使用。...⒉在主函数当中指针变量用cosnt进行了修饰就说明返回时候我们是不能对其指向地址进行修改变量值,一旦对其进行修改编译器就会报错error。这个做法是达到目地。...⒊在这里如果我们把主函数当中指针变量中const去掉不对其进行修饰,此时如果我们对其进行修改编译器只会报出警告warning并不会报错 作用 提醒你对其返回值进行了const修饰。

49320

记64位地址截断引发挂死问题

32位和64位代码区别 在分享之前,需要了解一下32位和64位程序代码有何区别,它主要区别体现在某些数据类型占用字节大小不同: 数据类型 32位 64位 long 4字节 8字节 unsigned...,在访问指针时,出现错误,提示访问非法内存 打印传入定时器指针地址,发现异常,地址开头4字节为全f,不正常,因此怀疑该指针最开始就已经出问题 跟踪启动定时器部分,动态库接口返回地址值,就已经异常了。...发现,编译时出现错误,提示函数没有声明 于是加上声明之后编译通过,但并没有出现挂死问题 随即继续跟踪原项目出问题进程,发现同样这些接口都没有外部声明,再加上另外一个进程警告信息,提示有int往指针强转...也就是说,如果函数实际有返回值,但是函数返回类型却没有指明,编译器会将其默认为int。...而正因如此,就有了第二个警告,提示从整型转换成指针。 到此其实也就真相大白了。既然testFun返回值被编译器默认为int,返回一个8字节指针类型,而返回值却是int,自然就会被截断了。

85320

【C++】类型转换

一、C语言中类型转换 在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回类型与 接收返回类型不一致时,就需要发生类型转化 , C 语言中总共有两种形式类型转换...隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 2....显式类型转换将所有情况混合在一起,代码不够清晰 因此 C++ 提出了自己类型转化风格,注意 因为 C++ 要兼容 C 语言,所以 C++ 中还可以使用 C 语言 转化风格 。...1.static_cast static_cast用于非多态类型转换(静态转换),编译器隐式执行任何类型转换都可用static_cast,但它不能用于两个不相关类型进行转换。.../引用转换为子类对象指针或引用(动态转换) 向上转型:子类对象指针 / 引用 -> 父类指针 / 引用 ( 不需要转换,赋值兼容规则 ) 向下转型:父类对象指针 / 引用 -> 子类指针

15020

C++复习篇

25.泛型函数模板(兼容不同类型) 26.泛型类模板(兼容不同类型) 27.数值型函数模板和数值型类模板(兼容不同数值) 28.C++智能指针 29.Qt中智能指针 1.const const和define...,只需要重写它即可,而QT库只需要根据vertual特性来自动调用我们重写函数,非常灵活. 25.泛型函数模板(兼容不同类型) 函数模板是C++中重要代码复用方式, 可通过不同类型进行调用 通过template...函数模板也支持多参数,示例如下(如果定义了返回值模板,则必须要显示指定返回类型,因为编译器不知道到底返回什么类型): #include using namespace std;...构造函数为explicit类型,所以只能显示初始化 提供get()成员函数,可以用来查看类里指针地址 一个堆空间永远只属于一个对象(比如auto_ptr被拷贝/赋值,则自身指针指向地址会被抢占)...29.Qt中智能指针 -QPointer 当其指向对象被销毁时,本身会自动赋值为NULL(从而避免被多次释放和野指针) 缺点在于,该模板类析构时,不会自动摧毁所指向对象(需要手工delete)

1.3K20

C语言指针初始化和赋值

所以如果写出int *p = 0x12345678 ; 这条语句编译器会报错:’=’ : cannot convert from ‘ const int ‘ to ‘ int * ‘ ,因为赋值操作符左边和右边表达式类型应该相同...也就是说,我们可以将0、0L、’/0’、2–2、0*5以及(void *)0赋给一个任何类型指针,此后这个指针就成为一个空指针,由系统保证空指针指向任何对象或函数。...,如:char *cp = “abcdefg”; 对指针进行初始化或赋值实质是将一个地址或同类型(或相兼容类型)指针赋给它,而不管这个地址是怎么取得。...C语言中malloc函数返回值就是一个void *型指针,我们可以把它直接赋给一个其他类型指针,但从安全编程风格角度以及兼容性上讲,最好还是将返回指针强制转换为所需类型,另外,malloc在无法满足请求时会通过返回一个空指针来作为...“内存分配失败”信号,所以要注意返回指针判空。

2.4K10

C++特殊类设计+类型转换

C语言中类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回类型与接收返回类型不一致时,就需要发生类型转化,C语言中总共有两种形式类型转换:隐式类型转换和显式类型转换...隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 void Test () { int i = 1; // 隐式类型转换...3.1 static_cast static_cast用于非多态类型转换(静态转换),编译器隐式执行任何类型转换都可用static_cast,但它不能用于两个不相关类型进行转换 int main(...// 所以非常BUG,下面转换函数指针代码是不可移植,所以建议这样用 // C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定结果 //.../引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全) 注意: 1. dynamic_cast只能用于含有虚函数类 2. dynamic_cast

1.2K30
领券