黑马程序员————IOS学习笔记 第5篇 OC特殊语法 (1)

                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、点语法

      在前面学到了set、 get方法带来的封装的好处,但在实际的开发过程中不是直接用[Person  setAge]来设置age的值,而是用点语法。点语法跟set 和get方法有关,可方便其

他行业能够访问成员变量。编译器对点语法进程翻译并执行 本质还是转换为方法调用实质还是 set函数和get函数。

之前学习的 方法调用:

Student *stu = [Student new];

[stu setAge:100];

int age = [stu  age];

利用点语法来对属性访问:

stu.age = 100;

int age = stu.age;

注意:

由于点语法与方法调用的作用一直,因此下面的代码会引发死循环

 -(void) setAge:(int)age{

self.age = age;

}

- (int) age{

returnself.age;

}

二、成员变量的作用域

1.作用域类型:

 @private:只能在当前类的对象方法中直接访问

 @protected:可以在当前类以及子类的对象方法中直接访问

 @public:任何地方都可以直接访问

 @package:同一个“体系内”(框架)可以访问,介于@private和@public之间

注意:

1.@interface中定义的成员变量默认是protected

2.@ implementation中定义成员变量默认是private


三、@property  和@systhesize关键字

         之前学习的set和get这两种方法都要进行声明和实现,在开发过程中是一项非常浪费时间的无聊代码,因此在开发过程中可以使用@property  和@systhesize关键字来解决这个麻烦,它们可以让xcode自动生成set get方法的声明与实现。

1.@property可以自动生成seter geter 函数 的声明

之前的声明:-(void)setAge : (int)age;

现在用关键字声明代替:@property int age ;

2.@ sysnthesize可以生成seter geter函数的实现

 用@synthesize age = _age;就可以代替

- (int)age{

               return_age;

}

- (void)setAge:(int)age{

               _age= age;

}

@sysnthesize注意:

1.@sysnthesize age=_age;会访问_age,即set get 都是访问的_age,如果_age成员变量没有声明不存在,就自动生成private类型的,则有时可以不用写成员变量的声明

2.@ sysnthesize  age; 默认会访问age成员变量,那么setter和getter实现中会访问成员变量age,如果成员变量age不存在,就会自动生成一个@private的成员变量age


总结:

1.在使用这两个关键字时:若手动实现了setter方法,编译器就只会自动生成getter方法

                                           若手动实现了getter方法,编译器就只会自动生成setter方法

                                           若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量

2.在级别较高的编译器如Xcode4.4版本中可以只用@property类型,可以完成3个步骤,声明实现setter getter方法 ,定义成员变量_gae。它的原则是已经手动写的就用写的

getter setter函数,如果没有就用编译器自动生成的方法。若果s g 都有了那么就不会生成_age

四、id

  id是一个指针类型,万能指针,能够指向任何OC对象 

   id==NSObject *

 当id类型作为函数传入参数时,可以用任意类的对象作为参数

   id类型的定义

typedefstructobjc_object {

Classisa;

} *id;

它的一个应用:(可以看出它可以指向任意类的对象)

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
@property id obj;
@end

 person.h

import "Person.h"

@implementation Person

@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"


void test(id d)
{
    
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *p = [Person new];
        //[p fsdfdsfd];
        
        NSObject *o = [Person new];
        
        id d = [Person new];
        
        [d setAge:10];
        
        [d setObj:@"321423432"];
        
        NSLog(@"%d", [d age]);
    }
    return 0;
}
注意:

1.id调用不存在的方法编译器会马上报错

2.id后面不要加 *

 

五、SEL

      SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,把方法转换成sel类型的数据 然后去类中去寻找对应的方法

知识点:

1. 把方法转化为SEL类型 ,根据这个SEL类型找到方法地址,并执行这个方法

SEL s =@selector(test)

[p  performSelector : s]      

2.将方法的名称转化为sel类型并执行该方法

NSString *name = @"test2";     

SEL s = NSSelectorFromString(name);  //把方法名(即字符串)转化为SEL类型    

[p performSelector:s];

3.每个方法中都有一个 _cmd :代表着当前方法的SEL , 下面的代码会引发死循环

- (void)test{

    [self performSelector:_cmd];

}

利用_cmd可以打印当前方法的方法名字

 NSString *str = NSStringFromSelector(_cmd);

 NSLog(@"调用了test方法-----%@", str);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值