- 浏览: 904360 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (466)
- iPhone, iOS , Objective-c (155)
- 数据库 (20)
- 设计模式 (5)
- 第三方包管理,cocoapod (2)
- 版本管理, SVN, Subversion, Git (1)
- Google, Android, Java (14)
- Wordpress (1)
- 职业素养 (3)
- 版本管理,git (3)
- 前端小技巧 (2)
- flash (1)
- javascript (5)
- Ruby (0)
- 编程语言 (1)
- 网络常识 (1)
- 找到生活好感觉 (5)
- 产品经理 (1)
- markdown (1)
- 云服务器 (1)
- iPhone (116)
- iOS (116)
- Objective-c (116)
- 学习技巧 (2)
- Google (5)
- Android (6)
- Java (21)
- python (1)
- sqlite (3)
- node.js (2)
- mongodb (2)
- 学习技巧,阅读 (2)
- 软件测试 (3)
- 架构设计 (2)
- 设计 (1)
- Spring framework (3)
- junit (1)
- Linux (2)
- 软件 (1)
- Struts2 (1)
- 版本管理 (3)
- SVN (3)
- Subversion (3)
- Git (3)
- mysql (5)
- quartz (1)
- 无关技术 (1)
- 前端 (1)
- Redis (1)
- 产品管理 (0)
- 计算机常识 (1)
- 计算机科学 (0)
- swift (1)
- 服务器 (2)
- 搜索 (1)
- Scala (1)
- J2EE (1)
- maven (1)
- 前端css (1)
- 英语 (1)
- 消息队列 (1)
- kafka (0)
- apache kafka (4)
- netbeans (1)
- IDE (2)
- 歌词 (1)
- 过滤器实现 (1)
- linux vim vi (1)
- jmeter (1)
- springcloud (1)
最新评论
-
hujingnemo:
不知道为什么打不开
CHM如何改编字体大小 -
weiboyuan:
求答案 weiboyuanios@163.com
iOS软件工程师面试题(高级) -
xueji5368:
这个现在已经广泛使用了嘛!
RoboGuice入门 -
Yao__Shun__Yu:
...
CHM如何改编字体大小 -
353144886:
非常之详细 美女求认识
sqlite数据类型 datetime处理
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++的引用很相似,别名
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++的引用很相似,别名
发表评论
-
oc为啥不用try catch
2016-03-23 11:56 1404简单的来说,Apple虽然同时提供了错误处理(NSError) ... -
ReactiveCocoa笔记
2016-03-14 12:31 0为什么使用MVVM?为什么使用ReactiveCocoa? 概 ... -
PINCache
2016-01-19 15:11 948PINCache是线程安全的键值缓存框架,用来储存难以获取或重 ... -
Swift设计模式
2015-12-29 12:04 0Swift设计模式 -
Understanding Swift access control
2015-12-29 12:03 0Swift takes an unusual approuac ... -
cocoapods因GEM_HOME升级遇到问题解决办法
2015-12-17 14:40 926Installing CocoaPods on OS X 10 ... -
swift 闭包的比较写法
2015-12-16 11:10 755let names = ["Chris", ... -
iOS 生成二维码,生成条形码图片
2015-12-03 15:44 1472#pragma mark - 生成条形码以及二维码 // ... -
解决cocoapods 更新慢的问题
2015-11-23 17:01 756最近使用CocoaPods来添加第三方类库,无论是执行pod ... -
iOS中级面试题
2015-11-20 15:12 1182OneV‘s Den在博客里出了10道iOS面试题,用他的话是 ... -
cocoapods出错解决方法
2015-11-09 13:09 746自定义GEM_HOME $ mkdir -p $HOME/So ... -
oc时间从美国时间改到中国时间
2015-10-19 14:12 979_formatter = [[NSDateFormatt ... -
27个iOS开发库
2015-07-24 16:10 769超长慎入列表: DZNEmptyDataSet(UI,空表格 ... -
Values of type 'NSInteger' should not be used as format arguments; add an explic
2015-07-24 10:10 844Values of type 'NSInteger' shou ... -
iOS架构心得体会
2015-05-18 18:35 815好的架构不是设计出来的,而是进行出来的。 我的iOS工程架构 ... -
UICollectionView NSInternalInconsistencyException出现的原因
2015-05-11 11:32 3414'NSInternalInconsistencyExcepti ... -
XLForm-iOS表单库
2015-05-08 14:44 909XLForm是最灵活和强大的iOS类库,用于创建动态table ... -
Info.plist Utility Error: “Info.plist couldn't be opened because there is no suc
2015-05-06 16:13 689http://stackoverflow.com/questi ... -
iOS中Autolayout中各种情况的使用的width,height策略
2015-04-30 15:33 685可以总结为: 如果项目不支持横屏显示,使用w:Compac ... -
一句话加上下拉刷新
2015-04-29 18:22 770怎么一句话添加上拉刷新? https://github.co ...
相关推荐
iOS 中,在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong 中的一个,这些修饰符有什么区别?下面我们来详细介绍。 assign: assign 一般用来修饰基本的数据类型,包括基础数据类型...
题目中使用了NSMutabelSet的实例,循环数组NSArray,将元素逐一添加到NSMutableSet中,最后打印集合中的对象数量。 4. NSLog和NSLog(): NSLog是Objective-C中用于输出信息到控制台的函数。NSLog()后面的括号是必须...
2. 对于代理(delegate)使用`weak`或`assign`,避免强引用循环。 3. NSTimer的循环引用可通过在不再需要定时器时调用`invalidate`并设为`nil`来解决。 4. 对于Block引起的循环引用,可以使用`__weak`修饰外部对象,...
属性的类型通常使用`assign`,除非对象需要保留对代理的强引用,这时使用`strong`。如果代理遵循协议并需要在协议方法中修改自身,可能会使用`weak`来防止循环引用。`copy`通常用于需要保持原始数据不变的情况,不...
为什么TableViewController的delegate常用assign而不是retain? - **原因**:为了避免循环引用问题,通常使用`assign`。 - **循环引用**:当两个对象互相持有对方的强引用时,会导致内存泄漏。 #### 11. 何时使用...
6. **@class**:在头文件中使用`@class`关键字可以向前声明一个类,而不必引入其完整定义,有助于减少头文件之间的依赖。 7. **线程与进程**:线程是进程内的执行单元,共享进程的资源,而进程是操作系统分配资源的...
1. **声明遵循NSCopying或NSMutableCopying协议**:要在自定义类中使用`copy`修饰符,首先需要声明类遵循`NSCopying`或`NSMutableCopying`协议。 2. **实现NSCopying协议**:实现协议中的`-(id)copyWithZone:(NSZone...
1. 使用`weak`或`assign`修饰`delegate`属性,尤其是在ARC环境中。 2. 在`Block`中谨慎处理`self`引用,考虑使用`__weak`或`__strong`局部变量。 3. 对于`NSTimer`,确保在不再需要时调用`invalidate`来释放引用。 ...
8. **Objective-C++**:Objective-C是Objective-C的超集,意味着你可以直接在Objective-C代码中使用C++。这对于使用C++库或编写高性能代码很有帮助。 9. **Foundation框架**:这是iOS开发的基础,包含了诸如NSArray...
`声明了一个名为`name`的不可变字符串属性,使用`strong`引用类型。 4. **数组与字典的创建与使用**: - **数组**:使用`NSArray`或`NSMutableArray`。例如`NSArray *array = @[@"a", @"b", @"c"];`。 - **字典**...
7. 内存管理:Objective-C使用引用计数(ARC,Automatic Reference Counting)系统来自动管理内存。当对象的引用计数变为零时,系统会自动释放该对象。 8. KVC(Key-Value Coding)与KVO(Key-Value Observing):...
- Objective-C允许为已存在的类添加新的方法,不改变原有类的代码,增强了代码复用。 7. **协议(Protocols)**: - 类可以遵循一个或多个协议,定义一组可选的方法声明,类似于Java或C#的接口。 - 协议常用于...
### 第102题:为什么不能初始化`NSData`为`NSString`类型? - `NSData`和`NSString`是两种不同类型的数据结构,前者用于存储二进制数据,后者用于存储文本字符串。尝试将`NSData`实例初始化为`NSString`类型会导致...
这里,`age`属性被声明为`assign`类型,意味着它不会持有强引用。 #### 二、Objective-C进阶 **2.1 协议与委托** **协议**定义了一组方法签名,表示类必须实现的行为。协议通常用来定义接口。例如: ```...