IOS开发中的变量、方法、属性
变量有四种访问范围:
私有(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是直接赋值,引用计数不会增加。
当数据为NSInteger、CGRect等标量类型时,应使用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 }

浙公网安备 33010602011771号