iOS学习(3)

4. 这个写法会出什么问题: @property (copy) NSMutableArray *array;

两个问题:1、加入,删除,改动数组内的元素的时候,程序会由于找不到相应的方法而崩溃.由于 copy 就是复制一个不可变 NSArray 的对象;

2、使用了 atomic 属性会严重影响性能 ;

第1条的相关原因在下文中有论述《用@property声明的NSString(或NSArray,NSDictionary)常常使用 copy keyword,为什么?假设改用strongkeyword,可能造成什么问题?》 以及上文《怎么用 copy keyword?》也有论述。

比方以下的代码就会发生崩溃

// .h文件

// http://weibo.com/luohanchenyilong/

// https://github.com/ChenYilong

// 以下的代码就会发生崩溃

@property (nonatomic, copy) NSMutableArray *mutableArray;

// .m文件

// http://weibo.com/luohanchenyilong/

// https://github.com/ChenYilong

// 以下的代码就会发生崩溃

NSMutableArray *array = [NSMutableArray arrayWithObjects:@1,@2,nil];

self.mutableArray = array;

[self.mutableArray removeObjectAtIndex:0];

接下来就会奔溃:

-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460

第2条原因。例如以下:

该属性使用了同步锁(atomic)。会在创建时生成一些额外的代码用于帮助编写多线程程序,这会带来性能问题,通过声明 nonatomic 能够节省这些尽管非常小可是不必要额外开销。

在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。

假设属性具备 nonatomic 特质,则不使用同步锁。请注意,虽然没有名为“atomic”的特质(假设某属性不具备 nonatomic 特质,那它就是“原子的”(atomic))。

在iOS开发中。你会发现。差点儿全部属性都声明为 nonatomic。

普通情况下并不要求属性必须是“原子的”,由于这并不能保证“线程安全” ( thread safety)。若要实现“线程安全”的操作,还需採用更为深层的锁定机制才行。比如,一个线程在连续多次读取某属性值的过程中有别的线程在同一时候改写该值,那么即便将属性声明为 atomic,也还是会读到不同的属性值。

因此。开发iOS程序时一般都会使用 nonatomic 属性。可是在开发 Mac OS X 程序时,使用 atomic 属性通常都不会有性能瓶颈。

时间: 2024-11-03 22:27:44

iOS学习(3)的相关文章

iOS学习笔记之UITableViewController&UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

iOS 学习资料整理

视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Application Development 该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评 Advanced iPhone Development - Fall

【资源】IOS学习资料 - 逆天整理 - 精华无密版【最新】【精华】

 入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~  01.IOS基础 01.iOS开发快速入门教程 http://pan.baidu.com/s/1kT3ScOf 链接: http://pan.baidu.com/s/1kTKheAF 密码: yycm 02.苹果开发零基础入门教程 http://pan.baidu.com/s/1dDfHL77 链接: http://pan.baidu.com/s/1o6iNkIu 密码: nn3a 03.黑马IOS2期基础 http:

iOS: 学习笔记, Swift操作符定义

Swift操作符可以自行定义, 只需要加上简单的标志符即可. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @assignment 赋值运算. +=, -=, --a, ++a // // main.swift // SwiftBasic // // Created by yao_yu on 14-7-27. // Copyright (c) 2014年 yao_yu. All rights reserved.

iOS学习之Map,定位,标记位置的使用

iOS上使用地图比Android要方便,只需要新建一个MKMapView,addSubView即可.这次要实现的效果如下: 有标注(大头针),定位,地图. 1.添加地图 1.1 新一个Single View app ,选择默认项,创建后,在ViewController.h [cpp] view plaincopy #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocati

IOS学习之路- 运行过程

1. 执行Main函数(在main.m文件中) 2. 加载MainStoryborad.storyboard文件 * 创建ViewController文件 * 根据storyboard文件中描述创建ViewController中的UIView(父层) * 创建UIView内部的所有子控件 * 将创建好的所有UIView对象跟ViewController做相应的关联(IBAction,IBoutlet  ) 3. 将程序的第一个控制器内部的UIview显示到手机屏幕上. IOS学习之路- 运行过程

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS: 学习笔记, 添加一个带界面约束的控制器

1. 创建一个空iOS应用程序(Empty Application). 2. 添加加控制器类. 修改控制器类的viewDidLoad 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 //创建标题 5 UILabel *header = [[UILabel alloc] init]; 6 header.text = @"欢迎来到我的世界!"; 7 header.textAlignment = NSTextAlignmentCenter

2015最新iOS学习线路图

iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置的众多技术和功能让 Apple设备始终保持着遥遥领先的地位. iOS学习路线:http://www.mobiletrain.org/page/ios.html 课程分  类 课程模块 模块介绍 课程内容 Part1C语言 C语言和Objective-C语言 C语言 Mac系统及常用工具.进制:C数据

ios学习记录 day41 UI17 多线程

CPU(工厂) 进程(车间) 线程(工人) 一个进程代表一个应用程序 CPU总是运行一个进程,其它进程处于非运行状态.一个进程可以包含多个线程.线程与线程之间可以共享进程的内存区域. 打开一个应用程序,系统会给我们创建一个线程,称为主线程 管理主界面的UI与内部循环机制(与界面相关的东西必须放在主线程中!!!) 压力比较大且会造成线程阻塞(界面卡),因此我们通过创建子线程来对主线程进行分压. 什么时候用多线程 1.网络请求(同步的) 2.文件读写(少) 3.大数据计算(冒泡) 4.数据库sele