IOS开发中的变量、方法、属性

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

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

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

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

 


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

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

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

 


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

 

posted @ 2012-07-30 09:43  Evolution.cc  阅读(310)  评论(0)    收藏  举报