黑马程序员------OC之点语法、成员变量作用域、@property和@synthesize

-----iOS培训、Android培训、Java培训,期待与您交流-----

OC之点语法、成员变量作用域、@property和@synthesize

一、点语法

1)点语法基本概念:当我们使用面向对象的封装特性后,将成员变量私有化,采取使用setter方法和getter方法向外面提供成员变量访问方案。那么我们知道,OC的调用方法的方式是很独特的,采用的是 [对象名(类名)  方法名]  的方式 ,那么很多Java、C#程序员就不习惯了,在Java、C#这些主流的面向对象语言中,调用方法的方式都是采用
 对象名(类名).方法名(), 如果成员变量采取public访问权限时,还可以直接  对象名.成员变量 = 值;  的形式。可能是出于让Java、C#程序员迅速习惯OC的语法,苹果公司让OC诞生了点语法。


 2)点语法代码初体验

首先,我们声明一个Person类

Person.h

//
//  Person.h
//  04-点语法
//

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;
    NSString *_name;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setName:(NSString *)name;
- (NSString *)name;

@end

Person.m

#import "Person.h"

@implementation Person

- (void)setAge:(int)age
{
    _age = age;

}

- (int)age
{

    return _age;

}

- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}

@end

测试程序:

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{
    Person *p = [Person new];

    // 点语法的本质还是方法调用
    p.age = 10; // [p setAge:10];

    int a = p.age; // [p age];

    p.name = @"Jack";

    NSString *s = p.name;

    NSLog(@"%@", s);

    return 0;
}

注意点:

1)点语法的本质是调用类的getter方法和setter方法,如果类中没有getter方法和setter方法就不能使用点语法。

点语法本质:

// 点语法的本质还是方法调用
    p.age = 10; // [p setAge:10];

    int a = p.age; // [p age];

2)下面的不恰当调用,会导致死循环

// 会引发死循环
    //self.age = age; // 相当于在调用 [self setAge:age];
}
// 会引发死循环
    //return self.age;//相当于 [self age];

二、成员变量作用域

@public : 在任何地方都能直接访问对象的成员变量

@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)

@protected : 可以在当前类及其子类的对象方法中直接访问  (@interface中默认就是@protected)

@package : 只要处在同一个框架中,就能直接访问对象的成员变量

 @public // 在任何地方都能直接访问对象的成员变量
    int _age;

    @private  // 只能在当前类的对象方法中直接访问
    int _height;

    @protected // 能在当前类和子类的对象方法中直接访问
    int _weight;
    int _money;

注意:

1)@interface和@implementation中不能声明同名的成员变量

2)子类继承父类,子类拥有父类的@public和@protected修饰的成员变量

3)如果在类中声明一个属性,没有指定访问权限,默认是@protected

三、@property 和  @synthesize

这两个关键字的出现,就是为了剔除代码中的setter方法和getter方法

1)@property

// @property:可以自动生成某个成员变量的setter和getter声明
@property int age;

//相当于下面这两句:
- (void)setAge:(int)age;
- (int)age;

2)@synthesize

// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age;

@synthesize height = _height;

@synthesize weight = _weight, name = _name;

这样,我们就省去了写setter方法和getter方法的时间,当然写那个也是极其无聊也是毫无意义。

但是,即便是这样,还是很不爽,在xcode的老版本中,为了避免书写setter方法和getter方法,我们还必须要在@interface 和 @end之间写上 @property int _age; 在@implementation 和 @end 之间写上 @synthesize的代码,很幸运,你们生活在一个幸福的时代,自从xcode4.4之后,@property int _age; 这句代码就把@property和@synthesize的活儿都给干了。

它主要做了下面这几件事:

1)生成_age成员变量的get和set方法的声明;

2)生成_age成员变量set和get方法的实现;

3)生成一个_age的成员变量。

当然,@property方法生成的getter方法和setter方法可能满足不了您的需求,您也可以自己手动添加getter方法和setter方法,如果手动写了setter方法@property就不会生成setter方法,但还是会生成getter方法,getter同理,如果您将setter方法,getter方法都进行手动书写了,@property将不会为您生成相应的getter方法和setter方法。

时间: 2024-12-16 10:57:09

黑马程序员------OC之点语法、成员变量作用域、@property和@synthesize的相关文章

黑马程序员 oc对象的方法成员变量

#import <Foundation/Foundation.h> typedef enum { SexMan, SexWoman } Sex; @interface Person : NSObject { /* 成员变量名前用下划线有3个用处 1>方便程序员之间的交流,一看到下划线就知道这个事成员变量 2>为了与getter方法中的方法名区分开 3>不与局部变量名重合 */ int _age; Sex _sex; } // 设置setter和getter方法 // 为了数据

黑马程序员——OC的特有语法

1. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ? 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Category) 2. 格式 ? 分类的声明 @interface 类名 (分类名称) // 方法声明 @end ? 分类的实现 @implementation 类名 (分类名称) // 方法实现 @end 3. 好处 ? 一个庞大的类可以分模块开发 ? 一个庞大的类可以由多个人来编写,更有利于团队合作 ? 4

黑马程序员——OC语言基本语法知识(五)

block :用来保存一段代码,用^ 1.block 特点:  1> Block封装了一段代码,可以在任何时候执行   2> Block可以作为函数或者函数的返回值,而其本身又可以带输入参数或返回值  3> 苹果官方建议尽量多用block,在多线程.异步任务.集合遍历.集合排序.动画转场用的很多  4> Block可以在程序运行时凭空产生一个代码保存起来 2.block的标志:^ 3.block跟函数很像  1> 可以保存代码  2> 有返回值  3> 有形参  

黑马程序员——OC语言基本语法知识(二)

一.基本使用 1.内存管理的范围:任何继承了NSObject的对象,对其他基本数据类型(int.char.float.double.struct.enum等)无效 2.对象的基本结构: *每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,即有多少人正在使用这个OC对象 *每个OC对象内部专门有4个字节的存储空间来存储引用计数器 3.引用计数器的作用*当使用alloc.new或者copy创建一个新对象时,新对象的引用计数器默认就是1*当一个对象的引用计数器值为0时,对象占用的

黑马程序员——OC语言基本语法知识foundation

1.结构体:NSRange .NSPoint(CGPoint). NSSize(CGSize). NSRect(CGRect) NSRange :表示范围,有两个成员变量:location ,length 例如:@“I love you”求出love的范围 int main() { NSRange r1= NsMakeRange{2,4}; return 0; } 例如:查找出某个字符串在str中的范围 NSString *str = @"I love you"; NSRanger r

黑马程序员——OC语言基本语法知识(一)

*** 封装 *** 一. set方法 通过 指针->成员变量名 方式给成员变量赋值具有危险性, 可能被赋值为不合理的数值.不允许通过指针直接修改成员变量, 就要去掉@public. 通过方法来修改成员变量的值, 方法中可以加代码保证接收的值是合理的赋值. 设置成员变量属性值的方法, 通常称为该属性的set方法, 命名方式为 setAge: , 接收一个相同类型的参数,形参的名称不能和成员变量名相同. 举例: - (void)setAge:(int)newAge { // 对传进来的参数值进行过

黑马程序员——OC语言基本语法知识(三)

*** 类方法 *** 声明和实现: @interface Person : NSObject + (void) age;  //声明一个类方法 @end @implementation Person + (void) age   //类方法的实现 { NSLog(@"abcd"); } @end int main() { [Person age];  //通过类名调用类方法 return 0; } 类方法比对象方法优化体现在不用创建对象就能执行行为. 在内存中, + 识别为类方法, 

黑马程序员——OC语言基本语法知识(四)

OC也叫面向对象c,在c语言的基础上增加了一层最小的面向对象语法特点: 1.完全兼容C语言 2.可以在OC代码中混入C语言代码,甚至是C++代码,不是任何源文件代码都能写c++代码,要把拓展名改一改才可以写 3.可以在OC开发 Mac OS X平台和IOS平台的应用程序 4..c只能写C语言代码,.m能写OC代码,也能写C语言代码,要写C++代码就要写.MM OC语法预览 1.关键字 基本上所有关键字都是以@开头,少部分不是以@开头 2.字符串以@开头 比如@"HELLO"是OC字符串

黑马程序员----OC的弱语法

OC弱语法 OC在运行过程中才会检测对象有没有实现相应的方法(动态监测),而即使没有写方法的实现代码,在编译.连接过程中只会有警告,运行时会奔溃,如果在手机上运行这样的代码,运行过程中就造成闪退! 1.如果对象调用了一个既没有声明又没有实现的方法test,编译能通过(有警告:warning: 'Person' may not respond to 'test'),但是还是能连接成功,但是运行时会出现下面的经典错误: 经典错误:不能识别消息发送给对象(运行时会监测方法有没有实现),会使程序运行时自