`
lizhuang
  • 浏览: 904360 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ARC中delegate为何不使用assign

 
阅读更多
I just ran into this problem and solved it. For ARC, the solution is to use the weak attribute instead of assign.

The crash come because the delegate

Has an assign attribute, AND
Has been deallocated.
Thus when you attempt to call the respondsToSelector method on delegate, you get a EXC_BAD_ACCESS. This is because objects that use the assign property will not be set to nil when they are deallocated. (Hence why doing a !self.delegate before the respondsToSelector does not prevent the responseToSelector from being called on a deallocated object, and still crashes your code)

The solution is to use the weak attribute, because when the object deallocates, the pointer WILL be set the nil . So when your code calls respondsToSelector on a nil, Objective C will ignore the call, and not crash.

As already mentioned, using a strong or assign attribute on a delegate (as many have mentioned) in ARC will result in a retain cycle. So don't do it, you don't need to.

assign “设置方法”只会招待针对“纯量类型”(scalar type,例如CGFloat或NSInteger等)的简单赋值操作。

strong 此特质表明该属性定义了一个拥有关系(owning relationship)。为这种属性设置新值时,设置方法会先保留新值,再释放旧值,然后再将新值设置上去。

weak 此特质表明该属性定义了一种非拥有关系(no owning relationship),为这种属性添加新值时,设置方法即不保留新值,也不保留旧值。此特质同assign类似,然而在改改所指的对象遭到摧毁时,属性值也会清空(nil out).

unsafe_unretained

看名字就知道了

不安全 不增加引用计数

NSString* str1 = @"123";

unsafe_unretianed NSString* str2 = str1;

[str1 release];

str2也跟着消失的无影无踪了,指针的地址空间都被清空了,和C++的引用很相似,别名
分享到:
评论

相关推荐

    IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义

    iOS 中,在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong 中的一个,这些修饰符有什么区别?下面我们来详细介绍。 assign: assign 一般用来修饰基本的数据类型,包括基础数据类型...

    IOS软件工程师笔试题(全选择题)【0-1年经验】.pdf

    题目中使用了NSMutabelSet的实例,循环数组NSArray,将元素逐一添加到NSMutableSet中,最后打印集合中的对象数量。 4. NSLog和NSLog(): NSLog是Objective-C中用于输出信息到控制台的函数。NSLog()后面的括号是必须...

    iOS内存管理方面的面试题汇总

    2. 对于代理(delegate)使用`weak`或`assign`,避免强引用循环。 3. NSTimer的循环引用可通过在不再需要定时器时调用`invalidate`并设为`nil`来解决。 4. 对于Block引起的循环引用,可以使用`__weak`修饰外部对象,...

    ios object-c 面试试题 及答案

    属性的类型通常使用`assign`,除非对象需要保留对代理的强引用,这时使用`strong`。如果代理遵循协议并需要在协议方法中修改自身,可能会使用`weak`来防止循环引用。`copy`通常用于需要保持原始数据不变的情况,不...

    ios开发ios基础开发面试题.txt

    为什么TableViewController的delegate常用assign而不是retain? - **原因**:为了避免循环引用问题,通常使用`assign`。 - **循环引用**:当两个对象互相持有对方的强引用时,会导致内存泄漏。 #### 11. 何时使用...

    IOS面试题归总

    6. **@class**:在头文件中使用`@class`关键字可以向前声明一个类,而不必引入其完整定义,有助于减少头文件之间的依赖。 7. **线程与进程**:线程是进程内的执行单元,共享进程的资源,而进程是操作系统分配资源的...

    iOS高级经典面试.pdf

    1. **声明遵循NSCopying或NSMutableCopying协议**:要在自定义类中使用`copy`修饰符,首先需要声明类遵循`NSCopying`或`NSMutableCopying`协议。 2. **实现NSCopying协议**:实现协议中的`-(id)copyWithZone:(NSZone...

    IOS 常见的循环引用总结

    1. 使用`weak`或`assign`修饰`delegate`属性,尤其是在ARC环境中。 2. 在`Block`中谨慎处理`self`引用,考虑使用`__weak`或`__strong`局部变量。 3. 对于`NSTimer`,确保在不再需要时调用`invalidate`来释放引用。 ...

    iphone开发比较实用,object-c注意事项,能提高不少

    8. **Objective-C++**:Objective-C是Objective-C的超集,意味着你可以直接在Objective-C代码中使用C++。这对于使用C++库或编写高性能代码很有帮助。 9. **Foundation框架**:这是iOS开发的基础,包含了诸如NSArray...

    Objective-C面试题.pdf

    `声明了一个名为`name`的不可变字符串属性,使用`strong`引用类型。 4. **数组与字典的创建与使用**: - **数组**:使用`NSArray`或`NSMutableArray`。例如`NSArray *array = @[@"a", @"b", @"c"];`。 - **字典**...

    Objective-C

    7. 内存管理:Objective-C使用引用计数(ARC,Automatic Reference Counting)系统来自动管理内存。当对象的引用计数变为零时,系统会自动释放该对象。 8. KVC(Key-Value Coding)与KVO(Key-Value Observing):...

    objective-c基础开发教程源代码

    - Objective-C允许为已存在的类添加新的方法,不改变原有类的代码,增强了代码复用。 7. **协议(Protocols)**: - 类可以遵循一个或多个协议,定义一组可选的方法声明,类似于Java或C#的接口。 - 协议常用于...

    iOS面试题2019年度总结188题(下).pdf

    ### 第102题:为什么不能初始化`NSData`为`NSString`类型? - `NSData`和`NSString`是两种不同类型的数据结构,前者用于存储二进制数据,后者用于存储文本字符串。尝试将`NSData`实例初始化为`NSString`类型会导致...

    Objective-C语言教程、案例与项目资源详解.docx

    这里,`age`属性被声明为`assign`类型,意味着它不会持有强引用。 #### 二、Objective-C进阶 **2.1 协议与委托** **协议**定义了一组方法签名,表示类必须实现的行为。协议通常用来定义接口。例如: ```...

Global site tag (gtag.js) - Google Analytics