博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS开发中的变量、方法、属性
阅读量:6939 次
发布时间:2019-06-27

本文共 4694 字,大约阅读时间需要 15 分钟。

转自 :

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

你可能感兴趣的文章
IN和EXISTS的详解
查看>>
在Mac上安装EA
查看>>
kmalloc详解
查看>>
Jquery 实现 微博,消息向上滚动
查看>>
Redis(一)——NoSQL入门和概述
查看>>
我为什么不看好 PHP 发展 ?
查看>>
使用jquery jcrop插件进行图片的截取与保存
查看>>
Spring Boot学习笔记-MVC
查看>>
Java身份证号码验证
查看>>
利用docker搭建php7和nginx运行环境的全过程
查看>>
C语言中的const和指针
查看>>
SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解实例详解(一)
查看>>
[有效]Hibernate之deleted object would be re-saved by cascade 异常的解决
查看>>
MongoDB 更新文档
查看>>
JavaScript创建对象(六)——寄生构造函数模式
查看>>
用C#创建Windows服务(Windows Services)
查看>>
C++ 指针的算术运算
查看>>
golang客户端sarama通过SSL连接Kafka配置
查看>>
SpringBoot之Admin监控系统
查看>>
javaweb Servlet开发
查看>>