一、点语法 : (方法调用)
2、java中的点语法是访问成员变量,而OC中的点语法转为相应的set方法和get方法
3、当使用点语法时,系统会自动展开对应的程序;
4、点语法的应用实例:
先来看一下刚刚学习时,我们经常见到的代码:
类的声明:
#import <Foundation/Foundation.h>
@interface Person: NSObject {
int _age;
}
- (void)setAge:(int)age;
- (int)age;
@end
类的实现:
#import "Person.h"
@implementation Person
- (void)setAge:(int)age {
age = age;
}
- (int)age {
return age;
}
@end
在Main函数中:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *p= [Person new ];
// 设置age的值
[p setAge:10];
// 取出age的值
int age = [p age];
NSLog(@"age is %i", age);
return 0;
}
上述的程序代码会稍显麻烦,用点语法就可以很方便的实现方法的调用
代码如下:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *p= [Person new];
// 设置age的值
cat.setAge=10;
// 取出age的值
int age = [cat.age];
NSLog(@"age is %i", age);
return 0;
}
5、总结:
1>、OC点语法的本质是方法调用,不是直接访问成员变量。
2>、比如:p.age = 10;就相当 [p setAge:10];而int a = p.age;相当于[p age];即其实OC是将 左边的转换为右边的
p.setAge=10; -------> [p setAge:10];
int age = [p.age]; -------> int age = [p.age];
6、注意self使用点语法的情况
当self和 . 有时在一起使用时会遭成死循环。
- (int)age
{
return self.age;
}
self.age展开就相当于[self age]
二、成员变量的作用域
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected : 可以在当前类及其子类的对象方法中可直接访问(@interface中默认的是@protected)
@package : 介于@public和@protected之间,只要处在同一个框架中,就能直接访问对象的成员变量
@interface和@implementation中不能声明同名的成员变量
在类的声明中,属性是用变量来表示的。这种变量就称为实例变量(成员变量),是在类声明的内部但是在类的其他成员之外声明的。类的每个对象维护它自己的一份实例变量的副本。实例变量作用域只限于为该类定义的实例方法。
局部变量也叫自动变量,它声明在函数内,作用范围也在函数内,不能同一源文件的其它函数使用,也不能其他文件中的函数使用,局部变量存储在栈中。无论局部变量显示初始化,或者未初始化,都只有当定义它们的程序快被调用时(及执行时),才分配空间,声明或定义时并不分配,局部变量不是可执行每模块的一部分!!除非显示地局部变量进行初始化,否则,它们的初始值是不确定的。
三、@property和@synthesize
在Person.h文件中
#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)setAge : (int)age;
- (int)age;
在Person.m文件中
#import "Person.h"
@implementation Person
- (void)setAge : (int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
如果有很多成员变量,这样就会写很多set、get函数,很麻烦
因此可以使用@property和@synthesize自动生成set、get方法,代替上述程序代码,如下程序代码:
#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
int _weight;
NSString *_name;
}
@property int age;
@property NSString *name ;
在Person.m文件中
#import "Person.h"
@implementation Person
@synthesize age = _age;
@synthesize name =_name;
@end
在main.h文件中
#import<Foundation/Foundation.h>
#import "Person.h"
int main ( )
{
@autoreleasepool{
Person *p = [Person new];
[p setAge:10];
}
return 0;
}
总结:1>、@property可以自动生成某个成员变量的set和get方法的声明
2>、@property生成set、get方法声明的过程
@property int age;
- (void)setAge:(int)age; - (int)age;
@property int _age;
- (void)set_age:(int)_age; - (int)_age;
属性名称不要写下划线。
3>、@synthesize帮助我们自动生成age的set和get方法的实现,并且会访问成员变量_age
4>、会访问成员变量_age,如果不存在,会自动生成@private类型的_age变量
5>、如果对象属性的数据类型一样,用@property可以以此写多个属性
@property int age,weight;
6>、 自从Xcode4.4后,@property包揽了@synthesize的功能,用@property可以同时生成set和get方法的声明和实现
四、id
1.id是一个万能指针,能指向\操作任何OC对象,相当于NSObject*
2.id类型的定义:
typedef struct objc object{
Class isa
}*id;
3.id的使用:
id p = [Person new];//注意id后不加*
注:当调用一个不存在的方法时,编译会马上报错
五、构造方法
在main.h文件中
#import<Foundation/Foundation.h>
#import "Person.h"
int main ( )
{
@autoreleasepool{
Person *p = [Person new];
/*完整地创建一个可用的对象,new的过程完成下面两个步骤
1.分配存储空间 +alloc
2.初始化 -init */
//1.调用+alloc方法分配存储空间
Person *p1 = [Person alloc];
//2.调用-init进行初始化
Person *p2 = [p1 init];
//上述两个代码也可以综合起来写成:Person *p = [[Person alloc] init];
}
return 0;
}
总结: 1>、构造方法:用来初始化对象的方法,是个对象方法,
2>、我们刚开始用[Person new]来创建对象,其实这中间完成了两个步骤:1.分配存储空间 +alloc 2.初始化 -init */
3>、调用+alloc方法分配存储空间:Person *p1= [Person alloc];
调用-init进行初始化:Person *p2 = [p1 init];
4>、上述两个代码也可以综合起来写成:
Person *p = [[Person alloc] init];
5>、初始化成员变量,可以重写init方法
在Person.m文件中
- (id)init
{
//1.一定要调用回super的init方法,初始化父类中声明的一些成员变量和其它属性
self = [super init];//当前对象 self
//如果对象初始化成功才有必要进行接下来的初始化
if(self != nil)
{ //初始化成功
_age = 10;
}
return self;//返回一个已经初始化完毕的对象
}
6>、重写构造方法的目的:为了让成员变量创建出来,就会有一些固定值
7>重写构造方法的注意点:先调用父类的构造方法[super init];再进行子类内部成员变量的初始化
8>、自定义构造方法:
一定是对象方法,一定以-开头;
返回值一般是id类型;
方法名一般以init 开头
- (void)initWithName:(NSString*)name
{
if(self = [super init]) {
_name = name;
//也可以写成_name=@"rose"
}
return self;
}
------ IOS培训、android培训、期待与您交流!-------
2、java中的点语法是访问成员变量,而OC中的点语法转为相应的set方法和get方法
3、当使用点语法时,系统会自动展开对应的程序;
4、点语法的应用实例:
先来看一下刚刚学习时,我们经常见到的代码:
类的声明:
#import <Foundation/Foundation.h>
@interface Person: NSObject {
int _age;
}
- (void)setAge:(int)age;
- (int)age;
@end
类的实现:
#import "Person.h"
@implementation Person
- (void)setAge:(int)age {
age = age;
}
- (int)age {
return age;
}
@end
在Main函数中:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *p= [Person new ];
// 设置age的值
[p setAge:10];
// 取出age的值
int age = [p age];
NSLog(@"age is %i", age);
return 0;
}
上述的程序代码会稍显麻烦,用点语法就可以很方便的实现方法的调用
代码如下:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *p= [Person new];
// 设置age的值
cat.setAge=10;
// 取出age的值
int age = [cat.age];
NSLog(@"age is %i", age);
return 0;
}
5、总结:
1>、OC点语法的本质是方法调用,不是直接访问成员变量。
2>、比如:p.age = 10;就相当 [p setAge:10];而int a = p.age;相当于[p age];即其实OC是将 左边的转换为右边的
p.setAge=10; -------> [p setAge:10];
int age = [p.age]; -------> int age = [p.age];
6、注意self使用点语法的情况
当self和 . 有时在一起使用时会遭成死循环。
- (int)age
{
return self.age;
}
self.age展开就相当于[self age]
二、成员变量的作用域
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected : 可以在当前类及其子类的对象方法中可直接访问(@interface中默认的是@protected)
@package : 介于@public和@protected之间,只要处在同一个框架中,就能直接访问对象的成员变量
@interface和@implementation中不能声明同名的成员变量
在类的声明中,属性是用变量来表示的。这种变量就称为实例变量(成员变量),是在类声明的内部但是在类的其他成员之外声明的。类的每个对象维护它自己的一份实例变量的副本。实例变量作用域只限于为该类定义的实例方法。
局部变量也叫自动变量,它声明在函数内,作用范围也在函数内,不能同一源文件的其它函数使用,也不能其他文件中的函数使用,局部变量存储在栈中。无论局部变量显示初始化,或者未初始化,都只有当定义它们的程序快被调用时(及执行时),才分配空间,声明或定义时并不分配,局部变量不是可执行每模块的一部分!!除非显示地局部变量进行初始化,否则,它们的初始值是不确定的。
三、@property和@synthesize
在Person.h文件中
#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)setAge : (int)age;
- (int)age;
在Person.m文件中
#import "Person.h"
@implementation Person
- (void)setAge : (int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
如果有很多成员变量,这样就会写很多set、get函数,很麻烦
因此可以使用@property和@synthesize自动生成set、get方法,代替上述程序代码,如下程序代码:
#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
int _weight;
NSString *_name;
}
@property int age;
@property NSString *name ;
在Person.m文件中
#import "Person.h"
@implementation Person
@synthesize age = _age;
@synthesize name =_name;
@end
在main.h文件中
#import<Foundation/Foundation.h>
#import "Person.h"
int main ( )
{
@autoreleasepool{
Person *p = [Person new];
[p setAge:10];
}
return 0;
}
总结:1>、@property可以自动生成某个成员变量的set和get方法的声明
2>、@property生成set、get方法声明的过程
@property int age;
- (void)setAge:(int)age; - (int)age;
@property int _age;
- (void)set_age:(int)_age; - (int)_age;
属性名称不要写下划线。
3>、@synthesize帮助我们自动生成age的set和get方法的实现,并且会访问成员变量_age
4>、会访问成员变量_age,如果不存在,会自动生成@private类型的_age变量
5>、如果对象属性的数据类型一样,用@property可以以此写多个属性
@property int age,weight;
6>、 自从Xcode4.4后,@property包揽了@synthesize的功能,用@property可以同时生成set和get方法的声明和实现
四、id
1.id是一个万能指针,能指向\操作任何OC对象,相当于NSObject*
2.id类型的定义:
typedef struct objc object{
Class isa
}*id;
3.id的使用:
id p = [Person new];//注意id后不加*
注:当调用一个不存在的方法时,编译会马上报错
五、构造方法
在main.h文件中
#import<Foundation/Foundation.h>
#import "Person.h"
int main ( )
{
@autoreleasepool{
Person *p = [Person new];
/*完整地创建一个可用的对象,new的过程完成下面两个步骤
1.分配存储空间 +alloc
2.初始化 -init */
//1.调用+alloc方法分配存储空间
Person *p1 = [Person alloc];
//2.调用-init进行初始化
Person *p2 = [p1 init];
//上述两个代码也可以综合起来写成:Person *p = [[Person alloc] init];
}
return 0;
}
总结: 1>、构造方法:用来初始化对象的方法,是个对象方法,
2>、我们刚开始用[Person new]来创建对象,其实这中间完成了两个步骤:1.分配存储空间 +alloc 2.初始化 -init */
3>、调用+alloc方法分配存储空间:Person *p1= [Person alloc];
调用-init进行初始化:Person *p2 = [p1 init];
4>、上述两个代码也可以综合起来写成:
Person *p = [[Person alloc] init];
5>、初始化成员变量,可以重写init方法
在Person.m文件中
- (id)init
{
//1.一定要调用回super的init方法,初始化父类中声明的一些成员变量和其它属性
self = [super init];//当前对象 self
//如果对象初始化成功才有必要进行接下来的初始化
if(self != nil)
{ //初始化成功
_age = 10;
}
return self;//返回一个已经初始化完毕的对象
}
6>、重写构造方法的目的:为了让成员变量创建出来,就会有一些固定值
7>重写构造方法的注意点:先调用父类的构造方法[super init];再进行子类内部成员变量的初始化
8>、自定义构造方法:
一定是对象方法,一定以-开头;
返回值一般是id类型;
方法名一般以init 开头
- (void)initWithName:(NSString*)name
{
if(self = [super init]) {
_name = name;
//也可以写成_name=@"rose"
}
return self;
}
------ IOS培训、android培训、期待与您交流!-------