转自 :http://www.0jl.com/?p=509

1、在Objective语言中可以声明实例变量(Instance Variables)。

变量有四种访问范围:
私有(private): 在声明它的类中可以访问。
保护(protected): 在声明它的类中可以访问,在继承类中也可以访问。
公共(public):在任何地方都可以访问。
包(package):同一个包中的类可以访问。

要通过方法才能给实例变量赋值,创建对象都会调用类的初始化方法(init)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#import <Foundation/Foundation.h>
//---- @interface section ----
@interface IntObject : NSObject {
@public int myInt;
}
@end
//---- @implementation section ----
@implementation IntObject
- (id)init {
    self = [super init];
    if (self) {
        myInt=100;
    }
    return self;
}
@end
//---- program section ----
int main (int argc, char * argv[]) {
    @autoreleasepool {
        IntObject *myIntObject = [[IntObject alloc]init];
        NSLog(@"myInt=%i",myIntObject->myInt);
    }
    return 0;
}

2、在Objective语言中可以声明用来存取实例变量的实例方法(Instance Methods)。

方法要通过消息传递(message passing)来调用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import <Foundation/Foundation.h>
//---- @interface section ----
@interface IntObject : NSObject {
    int myInt;
}
-(void)setInt:(int)n;
-(int)getInt;
@end
//---- @implementation section ----
@implementation IntObject
-(void)setInt:(int)n {
    myInt=n;
    NSLog(@"set myInt=%i",n);
}
-(int)getInt {
    return myInt;
}
@end
//---- program section ----
int main (int argc, char * argv[]) {
    @autoreleasepool {
        IntObject *myIntObject = [[IntObject alloc]init];
        [myIntObject setInt:100];
        NSLog(@"myInt=%i",[myIntObject getInt]);
    }
    return 0;
}

3、在Objective语言中可以直接声明属性(propertie)。

声明一个属性时会自动声明响应的实例变量和存取方法。
属性可以通过点运算符来存取,也可以使用消息传递。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#import <Foundation/Foundation.h>
//---- @interface section ----
@interface IntObject : NSObject {
}
//@property int myInt;
@property (nonatomic,assign) int myInt;
@end
//---- @implementation section ----
@implementation IntObject
@synthesize myInt;
@end
//---- program section ----
int main (int argc, char * argv[]) {
    @autoreleasepool {
        IntObject *myIntObject = [[IntObject alloc]init];
        // [myIntObject setMyInt:100];
        // NSLog(@"myInt=%i",[myIntObject myInt]);
        myIntObject.myInt=100;
        NSLog(@"myInt=%i",myIntObject.myInt);
    }
    return 0;
}

4、声明属性的时候可以设置一些可选参数。

声明属性时有一些可选的属性如:
设置存取:readwrite/readonly,setter=setterName,getter=getterName
设置引用:strong/weak/copy/assign/retain
非原子性:nonatomic

属性默认是可读写的,属性声明时会同时声明同名的私有实例变量和同名的读取方法,以及一个get前缀的设置方法。

假设a指向一个内存,此时这块内存的引用计数(reference counting)是1。
把a赋值给b,那么b也指向了这块内存,此时这块内存的引用计数是2。
当释放a以后,只有b指向了这块内存,此时这块内存的引用计数是1。
当再释放b以后,此时这块内存的引用计数是0,这时内存会回收。
assign是直接赋值,引用计数不会增加。
当数据为NSIntegerCGRect等标量类型时,应使用assign。
retain则在赋值的时候将引用计数加1。
copy则会创建并指向一个块新的内存。
如果不设置copy/assign/retain的话,默认是使用assign。

一个属性默认是原子性的,当属性在读写的时候会有一个 lock 和unlock的操作,防止在读写的过程中被其他的线程所改变。
在编写单线程程序的时候可以使用nonatomic,这样可以直接读写属性,提高效率。

Xcode 4.2中新增ARC功能,关闭这个功能后才能使用下面的代码。
关闭方法:在build setting中找到Objective-C Automatic Reference Counting,设置为No。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#import <Foundation/Foundation.h>
//---- @interface section ----
@interface StrObj : NSObject
@property (nonatomic,assign) NSMutableString *assStr;
@property (nonatomic,retain) NSMutableString *retStr;
@property (nonatomic,copy) NSMutableString *copStr;
@end
//---- @implementation section ----
@implementation StrObj
@synthesize assStr,retStr,copStr;
@end
//---- program section ----
int main (int argc, char * argv[]) {
    @autoreleasepool {
        NSString *myStr = @"Hello world!";
        NSMutableString *myMutStr = [[NSMutableString alloc] initWithString:myStr];
        StrObj *myStrObj = [[StrObj alloc]init];
        NSLog(@"=====List retain count=====");
        NSLog(@"myStr: %lu", [myStr retainCount]);
        NSLog(@"myMutStr: %lu", [myMutStr retainCount]);
        NSLog(@"myStrObj: %lu", [myStrObj retainCount]);
        NSLog(@"=====List retain count of myMutStr=====");
        [myMutStr retain];
        NSLog(@"myMutStr: %lu", [myMutStr retainCount]);
        [myMutStr release];
        NSLog(@"myMutStr: %lu", [myMutStr retainCount]);
         
        NSLog(@"=====List retain count of myStrObj=====");
        myStrObj.assStr=myMutStr;
        NSLog(@"assStr: %lu", [myStrObj.assStr retainCount]);
        NSLog(@"myMutStr: %lu", [myMutStr retainCount]);
        myStrObj.retStr=myMutStr;
        NSLog(@"retStr: %lu", [myStrObj.retStr retainCount]);
        NSLog(@"myMutStr: %lu", [myMutStr retainCount]);
        myStrObj.copStr=myMutStr;
        NSLog(@"copStr: %lu", [myStrObj.copStr retainCount]);
        NSLog(@"myMutStr: %lu", [myMutStr retainCount]);
         
        NSLog(@"=====Change myMutStr=====");
        [myMutStr setString:@"New World!"];
        NSLog(@"assStr: %@", myStrObj.assStr);
        NSLog(@"retStr: %@", myStrObj.retStr);
        NSLog(@"copStr: %@", myStrObj.copStr);
    }
    return 0;
}

转载于:https://www.cnblogs.com/letmefly/archive/2012/07/20/2600742.html

IOS开发中的变量、方法、属性相关推荐

  1. iOS开发中常用的方法

    iOS开发中常用的方法 系统弹窗: 过期方法: UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"确认报价" ...

  2. iOS进阶之iOS中实例变量与属性的区别(7)

    前言 在编写OC代码时,我们已经很熟练了使用@property关键字声明属性,以及如下声明实例变量: @interface MyViewController :UIViewController {NS ...

  3. ios加载本地html懒加载图片方案,IOS开发中加载大量网络图片优化方法

    IOS开发中加载大量网络图片如何优化 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过一段类似流的方式去加载网络图片,接着 ...

  4. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  5. 浅谈iOS 开发中的界面通信

    在任何的软件开发中都离不开界面与界面之间的通信,界面通信的最直接的方法就是界面传值. 在开发过程中我们在页面传值时我们通常使用的方法有:属性传值法,block传值法,代理传值法,以及单例传值法,通知传 ...

  6. iOS开发中键盘样式和自定义键盘。

    文章目录 系统自带的样式 自定义键盘 在系统自带键盘基础上自定义键盘 完全自定义键盘 自定义全部类型键盘 系统自带的样式 在iOS开发中系统自带键盘已经有很多样式,但是有时候并不能满足我们都开发需求, ...

  7. 如何深入理解 iOS 开发中的锁?

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

  8. 理解:iOS开发中锁的实现原理

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

  9. 深入理解 iOS 开发中的锁

    深入理解 iOS 开发中的锁 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知 ...

最新文章

  1. Hibernate总结2 API和配置文件
  2. pdo连接mysql数据库(简洁明了)
  3. 内核同步机制-读写信号量(rw_semaphore)
  4. nginx实现https网站设置
  5. [mark] some free templates sites
  6. 三步完成自动抢票,又一款春节免费抢票神器推荐
  7. 巴特沃斯归一化数字低通滤波器参数、原理及使用方法
  8. 上帝视角Hbase二级索引方案全解析
  9. visio2013画图时两条直线交叉, 如何让它不弯曲
  10. C++ 自定义函数(全)
  11. Visual Studio Code讲解(二) ssh远程操作电脑
  12. 算法学习01- 生兔子的问题
  13. 高数_第6章无穷级数
  14. 1.1 css style 样式定义:行内 style 属性、单页 <style> 标签、多页 <style> 标签
  15. 【笔记】 C++中 方向键的输入
  16. 10亿以内的阿拉伯数字转文字
  17. GWAS计算BLUE值2--LMM计算BLUE值
  18. 肝了1个月!2022 顶会论文代码大合集!
  19. 如何检查NAS硬盘有坏没有
  20. 深拷贝与浅拷贝是什么?如何实现浅拷贝和深拷贝?

热门文章

  1. cadence一些术语
  2. html表格筛选排序规则,excel表的排序功能你真的会吗?带你重新认识真正的排序功能...
  3. matlab 时间序列模型稳定度检验
  4. 【Verilog HDL 训练】第 01 天
  5. 【 MATLAB 】画出一个复指数序列的幅度、相位、实部和虚部的MATLAB脚本
  6. C标准库 limits.h
  7. Visual Studio Code 1.33 发布
  8. laravel5.5首次使用php artisan migrate注意问题:
  9. centos 7 安装jdk1.8
  10. css字体更小 css比12px更小的方法