1、copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。
创新互联是一家专注于成都网站设计、网站制作与策划设计,泗洪网站建设哪家好?创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:泗洪等地区。泗洪做网站价格咨询:028-86922220
2、原因:这里的copy是浅拷贝,并没有生成新的对象 由上面的例子可以得出:但是,我们一般声明NSString时,也不希望它改变,所以一般情况下,建议使用 copy ,这样可以避免NSMutableString带来的错误。
3、同样,copy修饰的是一个不可变对象nsstring,这里我们赋值时给予一个不可变对象nsstring,那么就不一样了。先分析第一段,从打印来看,strong修饰的strongStr和copy修饰的copysStr都是指向str的内存地址。
4、在 Student 类中添加分别由 strong 、 copy 、 weak 修饰的属性:在通过 Clang 编译后的 .cpp 文件中,看到会生成三个对应的 setter 方法:唯独在 setAge 的方法调用中,是通过 objc_setProperty 方法实现的。
static NSString* string = @aString} 这个样子我试了,编译器说Expected specifier-qualifier-list before static,报错。搁在花括号外面说是定义了没有使用。
涉及到了运行时。除了NSString类型之外,都不允许在方法外部声明一个‘静态全局常量类型的OC对象’。
对源头是NSString 的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就 是说其实二者都是指针引用,也就是浅拷贝。
如果你已经熟悉C语言,并且之前使用过面向对象语言编写过程序,下面的内容将会帮助你学习Objective-C的基础语法。 许多传统面向对象的思想,比如封装、继承、多态,都会在Objective-C中体现。
static inline 和 define 都是一种宏定义语法。 define 一般用来预编译常量, static inline 一般用来预编译函数。打印结果为:很显然,在处理 MULTI(10+10) 时,一般理解为: (10+10)*(10+10)=400 。
例如,我们的 Contact 类有一个正常的 name 属性,在内部它还有一个foldedName 属性,它将自动在 name变化时更新。那么我们就可以使用 NSLiteralSearch 来比较 name 的折叠版本。
到这里全部真相大白了,说明我们的copy修饰的array进行了浅拷贝,我们知道只有当不可变对象使用copy时才是浅拷贝,那我们copy修饰的是一个可变数组,赋值的是一个不可变数组。
为了避免可变对象找不到方法crash,或者不可变对象被篡改,iOS中的不可变对象、容器一般都使用copy修饰符,保证setter方法中对传入的新对象调用copy方法。
block 本质上是一个OC对象,内部有个 isa 指针,可以用 retain/strong/copy 等修饰词修饰。但是 block 在创建的时候内存默认分配在栈上,而不是堆上的。
async 表示函数里有异步操作, await 表示紧跟在后面的表达式需要等待结果。 同 Generator 函数一样,async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。
使用异步属性,必须只能是 get 属性。可写属性不能使用异步属性。public func resume(returning x: T) 接收 completion 中的数据返回,转换成 async 函数返回。
getData 执行完成 initData 执行完成 constructor 执行完成 调用的最外层函数中使用 async 修饰;在方法体中,使用 await 修饰要发送的同步请求;getData 方法是为了返回同步请求的res。